我需要检查是否有以下模式之一的行:

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

介词可以是列表中的任何一个单词,如{de,a,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);

不幸的是,这种模式不起作用!

最佳答案

为了简洁起见,我将使用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";

这与第二种情况不匹配,因为"egeg"后面有两个空格,所以它只能匹配第一种情况,但不是由于^。另外:
String myString = "egeg hello prep rfb tgnbv";

我们已经确定,这样的情况与第一个不匹配,也与第二个不匹配,这意味着^实际上是有效的。

09-12 21:35