有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式查找用空格分隔的单词,回溯

我必须找到用空格隔开的单词。使用最小回溯的最佳实践是什么

我找到了这个解决方案:

Regex: \d+\s([a-zA-Z]+\\s{0,1}){1,} in a sentence
Input: 1234 this is words in a sentence

所以,this is words-我必须使用regex([a-zA-Z]+\\s{0,1}){1,}进行检查,而单词in a sentence我必须使用regexin a sentences中的常量单词进行检查

但在本例中,是regex101。com给我调试4156个步骤,这是灾难性的回溯。有办法避免吗

我还有另一个更复杂的例子,它需要86000个步骤,但无法验证

主要问题是,我必须找到所有用空格分隔的单词,但同时regex包含用空格分隔的单词(常量)。这就是我遭遇灾难性回溯的地方

我必须使用Java来完成这项工作


共 (3) 个答案

  1. # 1 楼答案

    如果我理解正确的话,你想匹配任何由空格分隔的单词加上句子“in a句子”

    您可以尝试以下解决方案:

    (in a sentence)|(\S+)
    

    如regex101上的示例所示:Exemple

    正则表达式按61个步骤匹配。 在“in a句子”之后,你可能会遇到标点问题。做一些测试

    我希望我能帮上忙

  2. # 2 楼答案

    你想找到用space分隔的单词。所以你至少应该说1 or more space。你可以使用这个,只需要37个步骤

    \d+\s([a-zA-Z]+\s+)+in a sentence
    

    见演示

    https://regex101.com/r/tD0dU9/4

    对于java双转义所有ie \d==\\d

  3. # 3 楼答案

    您可以尝试将字符串拆分为一个字符串数组,然后在删除数组中与您的单词定义不匹配的任何成员(例如空格或puncuation)后,找到数组的大小

    String[] mySplitString = myOriginalString.split(" ");
    for(int x = 0; x < mySplitString.length; x++){
        if(mySplitString[x].matches("\\w.*"/*Your regex for a word here*/)) words++;
    }
    

    mySplitString是从原始字符串中拆分出来的字符串数组。将删除所有空白字符,并将空白之前、之后或中间的子字符串放入新的字符串数组中。for循环在拆分字符串数组中运行,检查每个数组成员是否包含一个单词(至少一次字符或数字),并将其添加到总字数中