2013-05-09 70 views
0

我有以下的正則表達式:Java正則表達式的錯誤

^(MIN|MAX|SUM|AVERAGE):[(\\d+(\\.\\d+)?), ]+$ 

我試圖實現應只允許下列格式的字符串規則:

OPERATION: (comma separated list of integers or real numbers) 

例如,下面的必被允許:

MIN: 7, 89.7, 67 
AVERAGE: 67.9, 89, 9 

然而,它接受的形式的輸入

MAX: , 

我該如何避免讓逗號兩邊的空格被接受?

+0

怎麼樣負數,或科學記數法? – leonbloy 2013-05-09 13:38:21

回答

0

嘗試

"^(MIN|MAX|SUM|AVERAGE)\\s?:\\s?(\\d+(\\.\\d+)?)(,\\s?\\d+(\\.\\d+)?)*$" 

測試:

MIN:4: true 
MIN:4,4: true 
MIN:4, 5: true 
MIN:4 , 5: false 
MIN: 7, 89.7, 67: true 
AVERAGE: 67.9, 89, 9: true 
MAX: , : false 
+0

@Anirudh檢查更新 – 2013-05-09 13:36:21

1

你可以使用這個表達式

^(MIN|MAX|SUM|AVERAGE):\s*\d+(\.\d+)?(\s*,\s*\d+(\.\d+)?)*$ 
-1

你在你的圖案有一個空格,所以你必須調整它一點點,最快捷的改變會是這樣,所以你仍然可以有空白空間在你的列表中的元素之間:

"^(MIN|MAX|SUM|AVERAGE):[(\d+(\.\d+)?)][(\d+(\.\d+)?), ]+$" 
+2

-1字符類'[]'只能包含範圍或字符 – Anirudha 2013-05-09 13:28:04

0

這會接受你的任何「行動」,的「:」符號和任何NUMER /點,逗號分隔,有或沒有1號前或任何逗號後的空格。 它也會阻止你的線以逗號結束。

Pattern pattern = Pattern.compile("^(MIN|MAX|SUM|AVERAGE):\\s?(\\d+?(\\.\\d+?)?,?\\s?)+?\\d$"); 
1

字符類不能像正在嘗試的那樣包含正則表達式結構。

這是導致較小的正則表達式其他答案稍有不同的旋轉:

(MIN|MAX|SUM|AVERAGE): \\d+(\\.\\d+)?(, \\d+(\\.\\d+)?)* 

的不需要的前緣和後^$ - 他們暗示。

要使用:

if (str.matches("(MIN|MAX|SUM|AVERAGE): \\d+(\\.\\d+)?(, \\d+(\\.\\d+)?)*") { 
    // yes, format is OK 
} 
+0

使用'^','$'取決於他用來匹配的方法! – Anirudha 2013-05-09 13:54:11

+0

@Anirudh只有'String.match()'必須匹配整個輸入,這就是爲什麼開始/結束是多餘的 – Bohemian 2013-05-09 13:55:29

+0

@Bohemian Matcher.find()怎麼樣? – 2013-05-09 14:03:57