2013-05-30 3 views
1

Я пытаюсь написать регулярное выражение, которое проверяет, чтобы убедиться, что после слов, которые я ищу, есть либо пробел, либо открывающие круглые скобки. Кроме того, я хочу, чтобы он оглянулся назад и убедился, что ему предшествует либо не-Word (\W), либо вообще ничего (т. Е. Это начало утверждения).Regex Lookahead and Lookbehinds: после этого

До сих пор у меня есть,

"(\\W?)(" + words.toString() + ")(\\s | \\()" 

Однако, это также соответствует материал на обоих концах - Я хочу, чтобы этот шаблон, чтобы соответствовать только само слово - не вещи вокруг него.

Я использую Java-рецепт Regex.

+1

Если это регулярное выражение соответствует строке, оно будет иметь 4 [группы] (http://docs.oracle.com/javase/tutorial/essential/regex/groups.html). Первая будет целая строка, третий будет тем словом, которое вы ищете. – sbk

ответ

2

Как вы помечено ваш вопрос, вам потребуется lookarounds:

String regex = "(?<=\\W|^)(" + Pattern.quote(words.toString()) + ")(?= |[(])" 
  • (?<=X) означает "предшествует X"
  • (?<!=X) означает "не предшествует X"
  • (?=X) средства «а затем X»
  • (?!=X) означает «не следуют X»
+2

Всегда используйте 'Pattern.quote()' при вставке некоторой простой строки в регулярное выражение. И '(? <= \\ W | ^)' можно сократить до '(?! \ W)'. Также обратите внимание, что '(? = | [(])' Должно быть '(? = | [(])' – nhahtdh

+0

@nhahtdh Можете ли вы привести пример с помощью 'Pattern.quote()'?Я не уверен, что вы имеете в виду – CodyBugstein

+0

Ваше регулярное выражение не работает для меня ... – CodyBugstein

0

Если вы не хотите, группа будет захвачена соответствия, вы можете использовать специальную конструкцию (?:X)

Таким образом, в вашем случае:

"(?:\\W?)(" + words.toString() + ")(?:\\s | \\()" 

Вы будете иметь только две группы, то, group(0) для всей строки и group(1) для слова, которое вы ищете.

+0

Я считаю, что вопрос не о * захвате *, но * matching *: '(? :)' не будет захватывать группу, но он будет по-прежнему соответствовать. – sp00m

+0

Это путаница словарного запаса. OP хочет сопоставить слово, предшествующее некоторой конструкции C1, а затем некоторую конструкцию C2, и только получить слово между ними. Он может сделать это, либо используя lookaround, как в вашем ответе, либо, сопоставляя все это и получая бит, который он хочет, как в моем. Результат будет таким же, и я думаю, что вопрос OP заключается в получении данных, а не о том, как использовать конкретную технику, но я могу ошибаться. –

+0

@CyrilleKa Вы правы; Я просто хочу вытащить данные, которые мне нужны, и если лучший способ не использует lookarounds, это тоже здорово. Однако ваш ответ не работает на меня ... – CodyBugstein

1

Что касается самого слова: всегда ли оно начинается с символа слова (то есть, который соответствует \w)? Если это так, вы можете использовать границу слова для ведущего условия.

"\\b" + theWord + "(?=[\\s(])" 

В противном случае, вы можете использовать отрицательный: 'назад

"(?<!\\w)" + theWord + "(?=[\\s(])" 

Я предполагаю, что слово либо цитировал так:

String theWord = Pattern.quote(words.toString()); 

... или не нужны быть.

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

  • Нет связанных вопросов^_^