2015-04-12 3 views
1

Я пытаюсь разработать регулярное выражение, которое будет соответствовать первому периоду в предложении, если этот период не находится внутри каких-либо круглых скобок.Пропуск разделов динамически в регулярном выражении

Так, например, строка:

Том (Ред.) Пошел в магазин, где собрались владельцы (J. Мужики, A. Владелец и B. AINS). Это была великая ночь.

Если вернуться:

Том (Ред.) Пошел в магазин, где собрались владельцы (J. Мужики, A. Владелец и B. AINS).

Однако, я считаю, что использование ленивого подхода, я только получаю:.

Том (Ed

И, используя жадный подход, очевидно, я получаю целое предложение. Не все предложения структурированы следующим образом (некоторые предложения не имеют круглых скобок, например), и я попытался использовать отрицательный поиск, но я не очень понимаю его.

У любого есть идея о том, как сделать oceed?

+0

Какой двигатель/инструмент/язык для регулярного выражения вы используете? Вам интересно или ожидать вложенные скобки? – HamZa

+0

Я использую инструменты Java Pattern. Я не ожидаю, что вложенные parenthese, нет, хотя есть возможность более одного набора parenthese для каждого совпадения. – SFX

+0

Классический подход заключался бы в создании группы (не) захвата, которая либо соответствует набору скобок, либо любому символу. См. Демонстрацию https://regex101.com/r/nN7wX6/1 – HamZa

ответ

1

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

(?=([^(]*\([^)]*")*[^)]*$)\. 

И чтобы соответствовать весь Tom (Ed.) went down to the shop where the owners (J. Guys, A. Owner, and B. Ains) gathered. предложение, вы можете использовать

.*?(?=([^(]*\([^)]*")*[^)]*$)\. 

Имеют посмотрите на demo. Кроме того, в Java, вам придется дважды бежать косую черту:

String pattern = ".*?(?=([^(]*\\([^)]*")*[^)]*$)\\."; 
+0

Я думаю, что это именно то, что я искал, большое спасибо! – SFX

0

Вы можете использовать следующее:

[^().]*\([^)]*\)[^().]* 

Demo

Эта модель содержит три части:

2 часть [^().]*, которая будет соответствовать любой длине любой строки, кроме () и dot

и \([^)]*\), которые будут соответствовать скобке с содержимым.

+0

Это близко к тому, что я хотел - но это не соответствует, если скобок вообще нет, похоже. Спасибо за вклад, однако, и я определенно буду изучать ваш ответ. – SFX

+0

@SFX приветствуется! это ответ на эту проблему, и у него может быть много решений для другого случая !!! – Kasramvd