2013-09-29 36 views
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 

我應該如何去修復它?

+0

「([a-zA-Z] * \ d + [a-zA-Z] * \\ - \ d +)|(\ d + \\ - [a-zA-Z] * \ d + [a-zA-Z] *)「會起作用嗎?我對這些正則表達式有點困惑。 –

回答

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-} 
+0

雖然這個正則表達式看起來有點長,但它看起來很完美。謝謝。 –

0

由於正則表達式定義,某些模式不匹配。

你的正則表達式表示:

(alphanumeric string)-(numbers string) OR (numbers string)-(alphanumeric string) 
  1. 45-45模式不匹配的原因是(數字字符串) - (數字字符串)
  2. 模式a-aaa4是不匹配的原因是(字母數字字符串) - (字母數字字符串)

您應該覆蓋更多的情況並重寫您的正則表達式。

+0

我寫了一個像(alphanumberic) - (字母數字)的條件,但是那些不應該匹配的模式,比如a-a也是匹配的。 –

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 
相關問題