有 Java 编程相关的问题?

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

java正则表达式,用于匹配句子中的最后一个字母和单词

用于搜索单词以及返回行中最后一个字符的正则表达式。 到目前为止,我得到的是->;“[a-z]$|[a-zA-z]+”

这篇文章是“很多???很好”

问题是“are”得到了匹配,而不是“e”,第二个正则表达式模式得到了优先权。我希望“are”与“e”匹配

有什么解决办法吗


共 (3) 个答案

  1. # 1 楼答案

    主要问题是正则表达式不能多次使用文本。您只能捕获重叠的文本,并且可以在lookarounds中进行捕获

    因此,您可以使用

    (?s)^(?=.*([a-z])$)|[a-zA-Z]+
    

    regex demo

    解释

    • (?s)-打开点调用模式,以便.可以匹配换行符
    • ^-字符串的开头
    • (?=.*([a-z])$)-一个正向前瞻,检查所有字符串并捕获最后一个字母。如果有尾随空格,则将其替换为(?=.*([a-z])\\s*$)。注意:可以使用\\p{Ll}匹配Unicode小写字母
    • |-或者
    • [a-zA-Z]+-1个或多个字母(实际上,您可以在Java中使用\\pL来代替它,以允许匹配Unicode字母)

    因为它是Java,所以您只需要检查第一个组是否不是null,如果不是,您就得到了最后一个字母。如果第一组为空,则得到一个单词

    String s = "many??? Woooooooooooords are"; 
    Pattern pattern = Pattern.compile("(?s)^(?=.*([a-z])$)|[a-zA-Z]+");
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()){
        if (matcher.group(1) != null) {
            System.out.println("Last letter: " + matcher.group(1));
        }
        else {
            System.out.println("Word found: " + matcher.group(0)); 
        }
    } 
    

    IDEONE demo

  2. # 2 楼答案

    至少在。NET、Java、Javascript和PHP(因此……这似乎是一个标准),组[0]包含所有匹配项本身,因此您只需要将正则表达式中的最后一个字母分组

    [a-zA-Z]+([a-zA-Z])$

    “很多???呜呜的是”

    你的文字如下:

    组[0]=“是”

    组[1]=“e”

  3. # 3 楼答案

    这个正则表达式的速度是[a-zA-Z]+($(?<=[a-z]))?
    与@Stribizev的相比

    最值得注意的是失败时,在本例中,最后一个字符不是小写

    基准

    失败(!=[a-z]$):
    样本"many??? Woooooooooooords are in the Fountain of despaR

    Regex1:   [a-zA-Z]+($(?<=[a-z]))?
    Options:  < none >
    Completed iterations:   50  /  50     ( x 1000 )
    Matches found per iteration:   8
    Elapsed Time:    0.68 s,   679.77 ms,   679771 µs
    
    
    Regex2:   ^(?s)(?=.*([a-z])$)|[a-zA-Z]+
    Options:  < none >
    Completed iterations:   50  /  50     ( x 1000 )
    Matches found per iteration:   8
    Elapsed Time:    1.14 s,   1139.35 ms,   1139345 µs
    

    成功(=[a-z]$):
    样本"many??? Woooooooooooords are in the Fountain of despar

    Regex1:   [a-zA-Z]+($(?<=[a-z]))?
    Options:  < none >
    Completed iterations:   50  /  50     ( x 1000 )
    Matches found per iteration:   8
    Elapsed Time:    0.68 s,   678.97 ms,   678965 µs
    
    
    Regex2:   ^(?s)(?=.*([a-z])$)|[a-zA-Z]+
    Options:  < none >
    Completed iterations:   50  /  50     ( x 1000 )
    Matches found per iteration:   9
    Elapsed Time:    0.72 s,   717.28 ms,   717276 µs