如何regExp'零或一个'组包含'.*'

use*_*807 1 java regex

我试图让record1,record2,record3从文字:

"Record1 ANY TEXT 123 4 5 Record2 ANOTHER TEXT 90-8098 Record3 MORE TEXT ASD 123"
Run Code Online (Sandbox Code Playgroud)

每条记录显示一次或零次.我使用模式:

(Record1.*)?(Record2.*)?(Record3.*)?
Run Code Online (Sandbox Code Playgroud)

如果出现每条记录,

matcher.group(1) == "Record1 ANY TEXT 123 4 5 Record2 ANOTHER TEXT 90-8098 Record3 MORE TEXT ASD 123"
matcher.group(2) == null
matcher.group(3) == null
Run Code Online (Sandbox Code Playgroud)

如果我使用模式:

(Record1.*)(Record2.*)(Record3.*)

matcher.group(1) == "Record1 ANY TEXT 123 4 5 "
matcher.group(2) == "Record2 ANOTHER TEXT 90-8098 "
matcher.group(3) == "Record3 MORE TEXT ASD 123"
Run Code Online (Sandbox Code Playgroud)

这是我想要的,但是每个记录都可以显示为零时间,并且此正则表达式不合适

我应该使用什么样的模式?

And*_*ong 5

你想让你的量词非贪婪,你想使用锚点:

^.*?(Record1.*?)?(Record2.*?)?(Record3.*?)?$
Run Code Online (Sandbox Code Playgroud)

在你的原始表达式中,你.*基本上消耗了字符串末尾的所有内容,因为这是正则表达式的行为方式,默认情况下(称为贪婪匹配).由于第二组和第三组是可选的,没有理由对发动机不会简单地匹配,首先一切.*-它是最有效的匹配.

通过添加?任何量词之后,例如 *?+???{m,n}?,您指示引擎尽可能少地匹配,调用非贪婪匹配.

那么,为什么锚?好吧,如果你调用非贪婪匹配,引擎会尝试尽可能少地匹配.所以,它没有任何匹配,因为你的所有组都是可选的!通过强制整个表达式匹配开头,^以及结束,$您强制使用正则表达式来找到一些方法来匹配尽可能少的字符.*?,但仍然匹配所需的所有细节.