Java 正则表达式:匹配组(如果存在),否则忽略并继续其他匹配
我一直在尝试在以下数据中匹配正则表达式模式: 字符串:Java 正则表达式:匹配组(如果存在),否则忽略并继续其他匹配,java,regex,regex-greedy,Java,Regex,Regex Greedy,我一直在尝试在以下数据中匹配正则表达式模式: 字符串: TestData到1个冒号分隔符列表有1行。设置…值为:1保存错误:267467374736437 TestInfo发送错误 要匹配的单词: 测试数据 267467374736437测试信息 我使用的正则表达式模式: (.+?\s)?.*(\s\d+-.*?\s)? 这里的场景是第二个匹配(267467374736437 TestInfo)可能在要匹配的字符串中不存在。所以,我希望它是一个匹配,如果它存在,否则继续进行其他匹配。因此,我添
TestData到1个冒号分隔符列表有1行。设置…值为:1保存错误:267467374736437 TestInfo发送错误 要匹配的单词:
(.+?\s)?.*(\s\d+-.*?\s)?
这里的场景是第二个匹配(267467374736437 TestInfo)可能在要匹配的字符串中不存在。所以,我希望它是一个匹配,如果它存在,否则继续进行其他匹配。因此,我添加了零或一个匹配量词?按照上面的分组模式。但是它忽略了第二组
如果我使用以下模式:
`(.+?\s)?.*(\s\d+-.*?\s)`
如果匹配字符串中的字符串“267467374736437 TestInfo”没有“?”量词,则匹配很好,但失败
请帮助我了解它哪里出了问题。我不想使用复杂的正则表达式,这将是一个丑陋的维护噩梦。相反,一种简单的方法是拆分字符串并获取第一个术语,然后使用智能正则表达式精确定位第二个术语
String input = "TestData to 1colon delimiter list has 1 rows.Set...value is: 1 Save Error: 267467374736437-TestInfo send Error";
String first = input.split(" ")[0];
String second = input.replaceAll(".*Save Error:\\s(.*)?\\s", "$1");
浏览正则表达式:
我宁愿不使用复杂的正则表达式,这将是一个丑陋的维护噩梦。相反,一种简单的方法是拆分字符串并获取第一个术语,然后使用智能正则表达式精确定位第二个术语
String input = "TestData to 1colon delimiter list has 1 rows.Set...value is: 1 Save Error: 267467374736437-TestInfo send Error";
String first = input.split(" ")[0];
String second = input.replaceAll(".*Save Error:\\s(.*)?\\s", "$1");
浏览正则表达式:
如果出现更通用的模式,则末尾的可选模式几乎永远不会不匹配。在您的例子中,贪心的点
*
会抓住整个行的剩余部分,直到最后一个模式是可选的,因此正则表达式引擎会调用它一天,并且不会尝试为它容纳任何文本
如果您有一个懒惰的点*?
,那么它唯一可以工作的位置就是在前面的子模式之后,这种情况很少发生
因此,您只能依赖一个标记:
^(\S+)(?:(?!\d+-\S).)*(\d+-\S+)?
看。
或展开的版本:
^(\S+)\D*(?:\d(?!\d*-\S)\D*)*(\d+-\S+)?
如果出现更通用的模式,那么末尾的可选模式几乎永远不会不匹配。在您的例子中,贪心的点
*
会抓住整个行的剩余部分,直到最后一个模式是可选的,因此正则表达式引擎会调用它一天,并且不会尝试为它容纳任何文本
如果您有一个懒惰的点*?
,那么它唯一可以工作的位置就是在前面的子模式之后,这种情况很少发生
因此,您只能依赖一个标记:
^(\S+)(?:(?!\d+-\S).)*(\d+-\S+)?
看。
或展开的版本:
^(\S+)\D*(?:\d(?!\d*-\S)\D*)*(\d+-\S+)?
那是行不通的。要求是什么?试试@WiktorStribiżew。。我还得试试。完成后我会告诉你的。谢谢。@WiktorStribiżew。。这很有魅力。谢谢。看到消极的世界很有趣。请让我知道我如何投票支持你的评论。这是行不通的。要求是什么?试试@WiktorStribiżew。。我还得试试。完成后我会告诉你的。谢谢。@WiktorStribiżew。。这很有魅力。谢谢。看到消极的世界很有趣。请让我知道我如何投票支持你的评论。