正则表达式将字母数字值与至少一个数字匹配

时间:2013-09-29 04:01:52

标签: java regex

我希望匹配一个在连字符两边至少有一个数字的字母数字字符之间包含连字符的模式。

我在Java中尝试了以下模式。但是下面提到的一些模式不匹配。

Pattern alpha_numeric = Pattern.compile("([a-zA-Z0-9]+\\-[0-9]+)|([0-9]+\\-[a-zA-z0-9]+)");

理想情况下,应该匹配的一些模式是:

a-45
45-a
45-45
a-aaa4
aaa4a-bbb5
a4aa-a etc

以下模式不匹配:

a-a
b-b etc

我应该如何修复它?

3 个答案:

答案 0 :(得分:1)

$ sed -r 's/([a-zA-Z0-9]*-[a-zA-Z]*[0-9][a-zA-Z0-9]*|[a-zA-Z]*[0-9][a-zA-Z0-9]*-[a-zA-Z0-9]*)/{\1}/g' file
{a-45}
{45-a}
{45-45}
{a-aaa4}
{aaa4a-bbb5}
{a4aa-a}
a-a
b-b
-
a-
-a
{-4}
{4-}

答案 1 :(得分:0)

由于正则表达式定义,某些模式不匹配。

你的正则表达式说:

(alphanumeric string)-(numbers string) OR (numbers string)-(alphanumeric string)
  1. 模式45-45不匹配,因为它是(数字字符串) - (数字字符串)
  2. 模式a-aaa4不匹配,因为它是(字母数字字符串) - (aplhanumeric string)
  3. 您应该覆盖更多案例并重写您的正则表达式。

答案 2 :(得分:0)

您必须考虑“至少一位数”的要求,正则表达式转换为

  

\ d + - 要求Java字符串中的转义符号

示例:

    public void test() {
    final List<String> testCases = Arrays.asList("a-45",
            "45-a",
            "45-45",
            "a-aaa4",
            "aaa4a-bbb5",
            "a4aa-a etc",
            "a-a",
            "b-b");

    final String regex = "[a-z]*\\d+[a-z]*";
    final String leftMatch = regex + "-.*";
    final String rightMatch = ".*-" + regex;

    for (String string : testCases) {
      System.out.println(string + " : " + string.matches(leftMatch + "|" + rightMatch));
    }
}

结果:

a-45 : true
45-a : true
45-45 : true
a-aaa4 : true
aaa4a-bbb5 : true
a4aa-a etc : true
a-a : false
b-b : false