Регулярное выражение с java

88
7

Мне нужно проверить строки, имеющие один из следующих шаблонов:


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

предлог может быть одним из любого слова в списке, таком как {de, à, pour, 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);

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

спросил(а) 2021-01-25T13:05:14+03:00 4 месяца, 4 недели назад
1
Решение
63

Для краткости я просто буду использовать 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]
.* в конце идет с обоими наборами скобок


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


String myString = "hello prep someWord mindless nonsense";

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

Если вы попробуете это, вы увидите, что на самом деле работает ^:


String myString = "egeg  prep rfb tgnbv";

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


String myString = "egeg hello prep rfb tgnbv";

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

ответил(а) 2021-01-25T13:05:14+03:00 4 месяца, 4 недели назад
45

Благодарю всех вас за ваши ответы. На самом деле, как сказал @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(""));

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


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


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


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

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


Тогда, предположив, что список предлогов {a, about}, out put будет:


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

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


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

ответил(а) 2021-01-25T13:05:14+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема