【问题标题】:Java regex - matcher with multiple string clarificationsJava regex - 具有多个字符串说明的匹配器
【发布时间】:2016-08-30 13:05:41
【问题描述】:

输入

45697B2

正则表达式模式:

static Pattern kindCodePattern = Pattern.compile("([a-zA-z])", Pattern.CASE_INSENSITIVE);

我在做什么

从输入中获取最后两个字符并匹配单个字符范围 a-z,如果找到删除最后两个字符,否则分配一个空

kindCode = input.substring(Math.max(input.length() - 2, 0));
        matcher = kindCodePattern.matcher(kindCode);
        Boolean isAvailableKindCode = matcher.find();
        if (isAvailableKindCode) {
            input = input.substring(0, input.length() - 2);
        } else {
            kindCode = "";
        }

但在某些情况下,我只想检查最后一个字符,比如我的输入是 45697B 然后

kindCode = input.substring(Math.max(input.length() - 1, 0));

怀疑:

如何在一次匹配中同时匹配这两种情况?有可能吗?

或者我的模式有什么变化?

【问题讨论】:

  • 我还没有测试过:我会尝试使用类似 "[A-Za-z].?$" 来匹配行尾可能后跟任何字符的字母。除了任何错误外,这应该与您的两个示例中的“B2”和“B”匹配。可以使用.group()从匹配器中取出实际匹配的子串。

标签: java regex


【解决方案1】:

按照我自己的说法,以下方法应该可以满足您的要求:

private static final Pattern kindCodePattern = Pattern.compile("[A-Za-z].?$");

public static String findKindcode(String input) {
    Matcher matcher = kindCodePattern.matcher(input);
    boolean isAvailableKindCode = matcher.find();
    if (isAvailableKindCode) {
        return matcher.group();
    } else {
        return null;
    }
}

给定输入"45697B2",它返回"B2"。给定"45697B",它产生"B"

45697BQ 给出BQ(不仅仅是Q),456972 给出null。希望您修改它以满足您的需要。

【讨论】:

  • 谢谢,但是我如何将不匹配的值(如 45697)分组为两个字符串 string1 = 45697 string2 =B
  • "^(.*?)([A-Za-z].?)$" 并从匹配器中分别取出两组?
  • 谢谢,这是完美的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多