0

我想匹配在字母数字字符之间包含连字符的模式,连字符的任一侧至少有一个数字。

我在 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

我应该如何修复它?

4

3 回答 3

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-}
于 2013-09-29T04:14:27.840 回答
0

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

你的正则表达式说:

(alphanumeric string)-(numbers string) OR (numbers string)-(alphanumeric string)
  1. 模式 45-45 不匹配,因为它是(数字字符串)-(数字字符串)
  2. 模式 a-aaa4 不匹配,因为它是(字母数字字符串)-(aplhanumeric 字符串)

您应该涵盖更多案例并重写您的正则表达式。

于 2013-09-29T04:12:34.580 回答
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
于 2013-09-29T04:34:20.730 回答