Показать несоответствующие строки, отрицание регулярного выражения - PullRequest
0 голосов
/ 30 августа 2011

Есть ли способ, где я могу отображать все символы и строки, кроме определенного набора слов или диапазона чисел, используя Java? Например:

Regex:

^(if|else),[0-9] 

Строка ввода:

if x <= 7

Выход:

Нераспознанные токены:

x , <=

Так как "if" и 7 отрицаются, они не появятся. Могу ли я отменить набор строк и диапазон чисел в одном регулярном выражении? Или есть какой-то другой способ, которым я могу просто отобразить непревзойденные строки? Наше задание - отобразить распознанные токены, а затем непревзойденные токены. Я исследовал и изучал регулярные выражения в течение трех дней, но до сих пор не могу выполнить свое задание. Заранее спасибо за любую помощь.

Ответы [ 3 ]

1 голос
/ 30 августа 2011

В зависимости от сложности проблемы, вы можете попробовать отрицательные прогнозирующие утверждения:

\b((?!if|else|\d)\w+)\b

или какую-нибудь безумную комбинацию прогнозирующего и отрицательного прогнозирования:

((?<=\A|\s)(?!if|else|\d)\S+)
1 голос
/ 30 августа 2011

Я бы использовал String.split () , чтобы разбить строку на токены, а затем сравнить каждый из токенов с вашим «списком фильтров».

Даже если вы могли бы сделать это, используярегулярное выражение, это было бы гораздо менее простым imo.

Edit:

На самом деле, вам даже не нужно перебирать результаты.Вы могли бы потенциально разделить слова «фильтра».Например:

String[] results = s.split(" *if *| *else *| *[0-9]+ *| +");

Обратите внимание, что вам нужно было бы оставить пробел в выражении, поскольку я предполагаю, что вы не хотите, чтобы x <= был единственным токеном в результатах.Кроме того, добавляя пробелы вокруг ключевых слов, вы не получите пустых строк в наборе результатов.

0 голосов
/ 30 августа 2011

да, я должен классифицировать лексемы (если, иначе, main) как токены (ключевое слово) 0-9 как NUM, так далее ...

\ b ((?! If | else |\ d) \ w +) \ упс, плохо, работает.я случайно удалил |.

...