使用正则表达式查找引用(Java引擎)

使用正则表达式查找引用(Java引擎),java,regex,Java,Regex,我想使用一些正则表达式来查找事件。例如,用户将输入: word1代码1-10001无 这意味着:搜索word1和code1以及-10001,而不是none 这些标准用于构建regexp 我有这样的文字行: 1-“我的常用词12包括GCode10-10001。记录结束”//这应该是真的,并返回“world12包括GCode10-10001。” 2-“这是另一行字12包括GCode10-10001记录无结尾”//这应为false且不返回任何内容 我试过这个: ^(?=.*?word1)(?=.*?c

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

word1代码1-10001

这意味着:搜索word1和code1以及-10001,而不是none

这些标准用于构建regexp

我有这样的文字行:

1-“我的常用词12包括GCode10-10001。记录结束”//这应该是真的,并返回“world12包括GCode10-10001。”

2-“这是另一行字12包括GCode10-10001记录无结尾”//这应为false且不返回任何内容

我试过这个:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)((?!none).)*$
(\\w*word1\\w*).*(\\w*code1\\w*).*(\\w*-10001\\w*)(?!none)
它适用于第1行,但返回所有行

我也试过:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)((?!none).)*$
(\\w*word1\\w*).*(\\w*code1\\w*).*(\\w*-10001\\w*)(?!none)
但它只给了我“word12”,“GCode10”,但它没有给我“-10001”,而且,它与第二行匹配!不应该


我不是regexp方面的专家…

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

^(?=.*?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());
} 
List matchList=new ArrayList();
Pattern regex=Pattern.compile(“^(?=.*word1)(?=.*code1)(?=.-10001)(?!.*none)。*$”,Pattern.MULTILINE);
Matcher regexMatcher=regex.Matcher(subjectString);
while(regexMatcher.find()){
add(regexMatcher.group());
} 
将为您提供符合您的标准的所有行的列表


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

logged
在您的问题中没有提到,但您似乎在正则表达式中使用了负前瞻。您是否想过使用普通循环来检查这些内容?如果用户键入
word*
?@Peter Lawrey:目前,它将包含在正则表达式模式中,因此它将检索0或n次出现的内容。。。我必须把\放在它前面,比如
word\*
?就我个人而言,我不会使用正则表达式,因为它会更简单,更可能在IMHO中工作。Tim给了我这些情况的答案:Pattern.quote()…是的,它可以工作,但它会检索所有行。我只想要从第一次到最后一次出现的项目。在我给出的示例中,它还将检索“我通常的…”感谢“Pattern.quote()”,我不知道。@Zamboo:啊,我忽略了这一点。嗯,这可不是那么容易——我想允许的模式可能以任何顺序出现?如果顺序不固定,这将不会是微不足道的。