2013-08-05 3 views
3

мне нужно проверить для линий, которые имеют либо одну из следующих моделей:Regex с Явой

preposition word ||| other words or what ever 
word preposition ||| other words or what ever 

предлог может быть один из любого слова в списке, как {де, à, налить, Quand,. ..} слово может быть предлогом или нет.

Я пробовал много моделей, как показано на следующем

File file = new File("test.txt"); 
Pattern pattern = Pattern.compile("(\\bde\\b|\\bà\\b) \\w.*",Pattern.CASE_INSENSITIVE);   
String fileContent = readFileAsString(file.getAbsolutePath());   
Matcher match = pattern.matcher(fileContent); 
System.out.println(match.replaceAll("c")); 

Эта модель матча предлог следует, по крайней мере, одно слово перед трубой. Я хочу соответствовать предлогу, за которым следует только одно слово перед трубой. Я попробовал следующую схему:

Pattern pattern = Pattern.compile("(\\bde\\b|\\bla\\b)\\s\\w\\s\\|.*",Pattern.CASE_INSENSITIVE); 

К сожалению, этот шаблон не работает!

+1

Возможно добавить '+' после '\\ w' в свой шаблон. Singe '\\ w' означает один буквенно-цифровой символ, в результате чего' \\ w + 'будет соответствовать одному или нескольким буквенно-цифровым символам. – Pshemo

+1

[здесь] (http://gskinner.com/RegExr/) - это веб-сайт, который может помочь. Это похоже на текстовый редактор для регулярного выражения (один из многих, который можно найти в Интернете). Не ответ на ваш вопрос, но он может помочь – scottyseus

+2

Не могли бы вы предоставить нам простой пример желаемого поведения (ввода/вывода)? –

ответ

1

Для краткости, я просто буду использовать prep стоять в качестве предлога, чтобы мы могли иметь дело с:

Pattern pattern = Pattern.compile("(?:(?:\\bprep\\b \\w+)|(?:\\w+ \\bprep\\b)).*", 
           Pattern.CASE_INSENSITIVE);  

(?:...) говорит группе, но сделать не захват
\\bprep\\b гарантирует, что prep сопоставляется только если он один, то он не будет соответствовать для preposition
\\w+ требует 1 или более[a-zA-Z_0-9]
.* в конце идет с обоими наборами скобок

РЕД (в ответ на комментарий):
"^(?:(?:\\bprep\\b \\w+)|(?:\\w+ \\bprep\\b)).*"работает, вы просто, скорее всего, работает в том случае, если у вас есть что-то вроде:

String myString = "hello prep someWord mindless nonsense"; 

Это будет матча, так как это захватывается вторым случаем: (?:\\w+ \\bprep\\b)).*.

Если вы попробуете это, вы увидите, что ^ фактически является работой:

String myString = "egeg prep rfb tgnbv"; 

Это не соответствует второму случаю, так как есть 2 места после "egeg", так что он может соответствовать только во-первых, но это не связано с ^. Дополнительно:

String myString = "egeg hello prep rfb tgnbv"; 

Мы установили, что такой случай не будет соответствовать первому, и он также не будет соответствовать второй, а это означает, что ^ это на самом деле работы.

+0

@ Dorsaf За исключением того, что вы захватываете без причины. Вот почему я предложил «(?: ...)». –

+0

да, вы правы. Это работает очень хорошо, за исключением того, что я не могу ограничить поиск началом строки, я попробовал «^ (?: (?: \\ bprep \\ b \\ w +) | (?: \\ w + \\ bprep \\ b)). * 'Однако это не работает! – Dorra

+0

@ Стив П. Я понял, почему я не работал на меня. Это потому, что я поместил весь файл, который я читал в одной строке. Я должен читать его по очереди и обрабатывать каждую строку отдельно. Теперь он отлично работает, спасибо – Dorra

0

Благодарю вас всех за ответы. На самом деле, как сказал @Pshemo, мне просто нужно добавить + после \ w. Я думал, что \ w означает слово.Он теперь работает со следующим кодом:

File file = new File("test.txt"); 
Pattern pattern = Pattern.compile("(\\bde\\b|\\bla\\b)\\s\\w+\\s\\|.*|\\w+\\s(\\bde\\b|\\bla\\b)\\s\\|.*",Pattern.CASE_INSENSITIVE) 
String fileContent = readFileAsString(file.getAbsolutePath());   
Matcher match = pattern.matcher(fileContent); 
System.out.println(match.replaceAll("")); 

В качестве вклада, например, у меня есть follwong линии:

мир ||| что-то здесь ||| другие вещи здесь

мира о | || кое-что здесь || другие вещи здесь

другой пример ||| что-то здесь ||| другие вещи здесь

окончательный и последний пример ||| что-то здесь ||| другие вещи здесь

Тогда, полагая, что список предлогов являются {, о}, то из положить будет:

другой пример ||| что-то здесь ||| другие вещи здесь

окончательный и последний пример ||| что-то здесь ||| другие вещи здесь

Как вы видите, я просто хочу, чтобы соответствовать два первых строк и удалить их ,

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