1

我想使用一些正则表达式来查找事件。例如,用户将输入:

word1 代码1 -10001没有任何

这意味着:搜索 word1 AND code1 AND -10001 AND NOT none

这些标准用于构建正则表达式。

我有这样的文本行:

1 - “我通常的 word12 包括 GCode10 -10001。记录结束” // 这应该为真并返回“world12 包括 GCode10 -10001。”

2 - “这是另一行 word12 包括 GCode10 -10001 none End of record” // 这应该是 false 并且不返回任何内容

我试过这个:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)((?!none).)*$

它适用于第 1 行,但它返回所有行

我也试过这个:

(\\w*word1\\w*).*(\\w*code1\\w*).*(\\w*-10001\\w*)(?!none)

但它只给了我“word12”,“GCode10”,但它错过了“-10001”,而且它与第二行匹配!它不应该。

我不是正则表达式的专家...

4

1 回答 1

2

你快到了,你只是错误地使用了负前瞻:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)(?!.*?none).*$

您还应该使用 multiline 选项编译正则表达式,除非您将每一行视为单独的字符串。所以,如果subjectString是多行字符串,

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("^(?=.*?word1)(?=.*?code1)(?=.*?-10001)(?!.*?none).*$", Pattern.MULTILINE);
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
} 

将为您提供满足您条件的所有行的列表。

如果您正在处理用户输入,您可能希望调用Pattern.quote()用户给您的所有字符串,因此任何正则表达式元字符都将被转义。

于 2012-04-13T15:10:29.793 回答