Использование регулярного выражения в Java - PullRequest
0 голосов
/ 14 декабря 2010

Мне нужно построить регулярное выражение для всех непустых последовательностей букв, кроме: file, for, from.

Таким образом, я должен в конечном итоге получить все значения из моего ввода текста, исключая 3 вышеупомянутых слова.

Это правильный способ изобразить это?

^(?:(?!file|for|from).)*$

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

Мой пример кода выглядит следующим образом:

Pattern p = Pattern.compile("^(?:(?!file|for|from).)*$");

// Split input with the pattern

String[] result = 

         p.split("file is not there from for this time for this test");

for (int i=0; i<result.length; i++)

    System.out.println(result[i]);

Есть ли ошибка в моем регулярном выражении или какая-то ошибка в том, как я использую регулярное выражение в Java?

Пожалуйста, сообщите.

Спасибо.

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Вы должны сделать что-то вроде этого:

String s = "file is not there from for this time for this test";
String[] splits = s.split("file|from|for");
0 голосов
/ 14 декабря 2010

Если вы не изучите RegEx, как, например, Isac, я считаю, что вам гораздо проще просто разбить строку, используя простой алгоритм разбиения, и вручную отфильтровать записи, которые вы не хотите находить. String.split() наш друг. Если список игнорируемых слов велик, рассмотрите возможность хранения их в HashTable и сверяйте каждое извлеченное слово с этой таблицей. Это изменит ваш алгоритм от O(N^2) до O(N).

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

Мой личный опыт показывает, что чаще всего ваше регулярное выражение становится очень сложным, трудным для чтения и медленным для оценки из-за множества непредвиденных откатов назад из-за использования .

0 голосов
/ 14 декабря 2010

В этом вопросе есть неясность. Вы хотите извлечь все слова строки, которые не относятся ни к одному (file, for, from)? Или вы хотите сопоставить строки, в которых нет ни одного из этих слов? «За» отказано, но как насчет «доступного»: принято или отказано?

Насколько я понимаю вопрос, я предлагаю перехватывать слова, не являющиеся 'file', 'for' или 'from', в цепочке следующей цепочки RE:

'\ б (файл |?! Для | от) \ ш +'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...