我需要检查是否有以下模式之一的行:
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";
我们已经确定,这样的情况与第一个不匹配,也与第二个不匹配,这意味着
^
实际上是有效的。