我希望匹配一个在连字符两边至少有一个数字的字母数字字符之间包含连字符的模式。
我在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
我应该如何修复它?
答案 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)
您应该覆盖更多案例并重写您的正则表达式。
答案 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