【问题标题】:Get substring at end of string that has no lowercase letters在没有小写字母的字符串末尾获取子字符串
【发布时间】:2015-10-06 14:27:39
【问题描述】:

我有这样的字符串:

[POS Purchase]
POS Signature Purchase International  SKYPE COMMUNICATIO, LUXEMBOURG, LUX

或:

ATM Cash Withdrawal. Surcharge: -3.0  BNEAIR INT DP LSL4 2, BNE AIRPORT, AUS

我想得到除了小写字母以外的任何字符的字符串的结尾。对于上面的两个例子,答案应该是:

SKYPE COMMUNICATIO, LUXEMBOURG, LUX

BNEAIR INT DP LSL4 2, BNE AIRPORT, AUS

如何使用正则表达式实现这一点?

【问题讨论】:

  • 您的要求与您的示例不完全匹配:“除小写字母外的任何字符”包括空格、标点符号、数字等。这与您的示例显示的不太一样,例如如果这是您的确切要求,第二个将在开头使用 : -3.0
  • 是的。我真正想要的只是以大写字母开头的部分。

标签: java regex pattern-matching substring


【解决方案1】:

根据您的需要,您正在寻找以下正则表达式:

[^a-z]+$

否定字符类[^a-z]+ 将匹配非小写字符的任意组合,而锚点$ 将使正则表达式引擎匹配字符串的结尾。

但请注意,这将与您的第二个示例中的 -3.0 匹配。如果您想使用它,可以将 [A-Z] 放在您的正则表达式的开头:

[A-Z][^a-z]*$

Debuggex Demo


您可以从这里开始了解更多关于正则表达式http://www.regular-expressions.info/

【讨论】:

    【解决方案2】:

    你可以使用这个正则表达式:

    [A-Z][A-Z\d, ]*$
    

    MULTILINE 模式下匹配您的数据。

    这将匹配以大写字母开头并后跟大写字母、数字、空格或逗号的文本。

    在 Java 中使用:

    Pattern regex = Pattern.compile("(?m)[A-Z][A-Z\\d, ]*$");
    

    RegEx Demo

    【讨论】:

    • 这不完全正确(因为他只是想排除小写,我们不知道它是否包含其他符号,如“:”或“-”)
    • 在不知道要求的情况下,您永远不能肯定地说“不完全正确”。让 OP 提出更多示例或更好的要求,然后我可以在需要时轻松调整答案。
    【解决方案3】:

    您可以使用以下自包含示例/模式来匹配以大写单词字符开头且不包含任何小写字符的最后一个字符串:

    String[] input = {
        "[POS Purchase]" + 
        System.getProperty("line.separator") + 
        "POS Signature Purchase International  SKYPE COMMUNICATIO, LUXEMBOURG, LUX",
    
        "ATM Cash Withdrawal. Surcharge: -3.0  BNEAIR INT DP LSL4 2, BNE AIRPORT, AUS"
    };
    //                            | starts with uppercase letter
    //                            |      | uppercase letters or no letters
    //                            |      |           | 0 or more times
    //                            |      |           | | end of input
    //                            |      |           | | 
    Pattern p = Pattern.compile("\\p{Lu}[\\p{Lu}\\P{L}]*$");
    for (String s: input) {
        Matcher m = p.matcher(s);
        if (m.find()) {
            System.out.println(m.group());
        }
    }
    

    输出

    SKYPE COMMUNICATIO, LUXEMBOURG, LUX
    BNEAIR INT DP LSL4 2, BNE AIRPORT, AUS
    

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多