Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式:匹配组(如果存在),否则忽略并继续其他匹配_Java_Regex_Regex Greedy - Fatal编程技术网

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发送错误

要匹配的单词:

  • 测试数据
  • 267467374736437测试信息
  • 我使用的正则表达式模式:

    (.+?\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。。这很有魅力。谢谢。看到消极的世界很有趣。请让我知道我如何投票支持你的评论。