2015-01-20 2 views
8

В строке строки с нечетным номером, как вы могли бы сопоставить (или захватить) средний символ?Как совместить средний символ в строке с регулярным выражением?

Возможно ли это с помощью PCRE, plain Perl или Java regex flavors?

С помощью .NET regex вы можете использовать balancing groups, чтобы решить эту проблему легко (это может быть хорошим примером). С помощью простого регулярного выражения Perl я подразумеваю не использование каких-либо кодовых конструкций, таких как (??{ ... }), с помощью которых вы можете запускать любой код и, конечно же, что-либо делать.

Строка может иметь любую длину нечетного номера.

Например, в строке 12345 вы хотели бы получить символ 3, символ в центре строки.

Это вопрос о возможностях современных ароматизаторов регулярных выражений, а не о лучшем алгоритме, который можно сделать каким-то другим способом.

+6

Perl: Да. Использование рекурсии или '/^(. *) (.) (?? {'.' X length ($ 1)}) \ z/s' – ikegami

+0

Разве это не зависит от контекста? – Oli

+0

@ikegami, я думаю, я не должен был говорить Perl или, по крайней мере, не использовать Perl-код. В этом случае вы можете просто использовать базовую строковую функцию. – Qtax

ответ

7

С PCRE и Perl (и, возможно, Java), вы можете использовать :

^(?:.(?=.*?(?(1)(?=.\1$))(.\1?$)))*(.) 

, который будет захватывать средний символ строк с нечетной длиной во второй группе захвата.

Explained:

^ # beginning of the string 
(?: # loop 
    . # match a single character 
    (?= 
    # non-greedy lookahead to towards the end of string 
    .*? 
    # if we already have captured the end of the string (skip the first iteration) 
    (?(1) 
     # make sure we do not go past the correct position 
     (?= .\1$) 
    ) 
    # capture the end of the string +1 character, adding to \1 every iteration 
    (.\1?$) 
) 
)* # repeat 
# the middle character follows, capture it 
(.) 
+2

Я нашел это: '^ (?:. (? =. * ((? (1). \ 1 |.)) $)) * \ K.', который не очень отличается. –

+2

или с правильным квантором: '^ (?:. (? =. + ((? (1). \ 1 |.)) $)) * \ K.' –

+2

@CasimiretHippolyte, приятное решение, +1! Вы должны опубликовать его. – Qtax

1

Хм, может быть, кто-то может придумать с чистым раствором регулярных выражений, но если вы не всегда можете динамически построить регулярное выражение так:

public static void main(String[] args) throws Exception { 
    String s = "12345"; 
    String regex = String.format(".{%d}3.{%d}", s.length()/2, s.length()/2); 
    Pattern p = Pattern.compile(regex); 
    System.out.println(p.matcher(s).matches()); 
} 
Смежные вопросы