2013-08-15 2 views
1

С этой моделью я могу соответствовать этому текстуИспользовать захват в шаблоне?

Patern:

"abc\(.*?\)abc" 

Текст:

"abc(" "")abc" 

Что делать, если я хочу, чтобы пользователь решить, как начать и закончить его. Вместо того, чтобы аЬс это может быть что угодно

Выкройка:

"(.*?)\(.*?\)$1" 

Текст:

"def(" "")def" 

Кроме этого не работает, так как она $ означает конец строки и не совпадает с 1-й группе. Возможно ли совпадение с регулярным выражением в .NET?

+2

Попробуйте использовать '\ 1' вместо' $ 1'. [demo] (http://regex101.com/r/rE1qQ4) – HamZa

+1

'$ 1' для замены строки. –

ответ

2

я в основном видел $1, используемые в разделе замены. Но в выражении это не сработает, вы должны использовать \1, поэтому ваше выражение будет выглядеть так: "(.*?)\(.*?\)$1".

Давайте немного поправим. Мы могли бы явно сопоставить отрицательный класс символов: \([^)]+\). [^)]+ означает совпадение всего, кроме закрывающей скобки, один или несколько раз. Таким образом, мы также устранили пустые скобки.

Теперь давайте применим то, что мы только что узнали, и сделать выражение также принимает одиночные кавычки: ("|')(.*?)\([^)]+\)\2\1

("|') # match either a single or double quote and put it in group 1 
(.*?) # match anything ungreedy zero or more times until ... and put it in group 2 
\(  # match opening parenthesis (
[^)]+ # match anything except closing parenthesis) one or more times 
\)  # match closing parenthesis 
\2  # match what was matched in group 2 
\1  # match what was matched in group 1 

Для дальнейшего использования, мы могли бы также использовать именованные группы. Вы можете объявить именованную группу в .NET со следующим синтаксисом (?<namedgroup>.*?). Затем вы можете использовать обратную ссылку, как показано ниже: \k<namedgroup>. Запомните этот синтаксис для .NET только. PCRE имеет другой синтаксис.

Принимая наше выражение выше в качестве примера может привести к следующей схеме:
(?<quotes>"|')(?<str>.*?)\([^)]+\)\k<str>\k<quotes>

Online .NET regex demo                                                                                                                                                                            For further reading >>>

2

Вы должны использовать \1 внутри шаблона регулярного выражения для обратной ссылки захвата группы:

"(.*?)\(.*?\)\1" 
+0

Я не думаю, что его можно использовать имя? Я попробовал \ имя, но это не сработало. Я переместил этот узор на фронт, и он работает так, как ожидалось. (Его большой рисунок) –

Смежные вопросы