2013-07-28 3 views
1

мне нужно регулярное выражение, которое соответствует в точности одно вхождение фигурная скобка пары:Regex: Matching точно одно вхождение

myString_{1-10}   -> match 
myString_{hello}_xyz -> match 
myString_{1-10}_{hello} -> do not match 

Вот мое регулярное выражение:

(\{)[^}]*(\}) 

Проблема заключается в том, что мое регулярное выражение также соответствует строкам, содержащим более одного вхождения фигурных скобок ... что мне не хватает?

+0

Как непарные скобки обрабатываются? Например, 'myString _} {}' или 'myString _ {} _ {' – SheetJS

+0

Вы повторяете весь абзац или продолжаете линию за строкой? –

ответ

2

Вы можете использовать это:

^[^{}]*\{[^}]*\}[^{}]*$ 

Объяснение:

^[^{}]* // Match 0 or more occurrences of character other than [{}] 
\{  // Match a `{` 
[^}]*  // Match 0 or more occurrences of character other than } 
\}  // Match a `}` 
[^{}]*$ // Match 0 or more occurrences of character other than [{}] 

Вы должны заботиться о вложенных скобок или несогласованных скобки слишком

+2

@Downvoter. Не забудьте прокомментировать. –

+0

И что, если я хочу только контент между фигурными фигурными скобками? Я пробовал это^[^ {}] * (? <= \\ {) [^}] * (? = \\}) [^ {}] * $, но он не работает – j3d

+0

Просто переместите контент внутри '{' и '}' в regex выше для захвата группы. Вы используете look-arounds, поэтому он не удалось. Используйте '^ [^ {}] * \ {([^}] *) \} [^ {}] * $' и получите захваченную группу '1'. –

0

Если вы регулярное выражение-ки в целом переменная, содержащая все три строки, это то, что вы ищете:

(\{.*?\})_*(?:\{)* 

Выход будет содержать именно то, что вы ищете.

Для этого требуется флаг «s» // точка соответствует всем.

+0

Подчеркивание было всего лишь примером ... Любой персонаж был бы возможен. – j3d

0

Вы можете использовать этот шаблон в .net с многострочным режимом:

(?<=^(?>[^{\n]*))\{[^}]*\}(?=[^{\n]*$) 
Смежные вопросы