我一直在使用http://www.regexplanet.com/advanced/java/index.html来测试我写过的正则表达式。
正则表达式为:\ A [\ d +( - \ d +){0,1} \ | \ d + \ | \ d + \ | [YN] {1}](,[\ d +( - \ d +) {0,1} \ | \ d + \ | \ d + \ | [YN] {1}])* \ž
我正在尝试匹配'[30-41 | 2 | 21 | Y]'或'[15-23 | 45 | 12 | Y],[15 | 42 | 6 | Y]'形式的字符串等
当在该站点上进行测试时,正则表达式似乎工作得很好但是当我在我自己的java代码中使用它时(见下文),它给了我意想不到的匹配(我在代码下方粘贴了控制台输出)。有谁知道我在这里做错了什么?
编辑:正如stema所指出的,在创建Pattern和Matcher时,我输入的字符串和模式的顺序错误。我现在已经交换了这一轮,但我现在正在'找不到匹配'。
public static void testRegex(String inputString){
String regex = "\\A\\[\\d+(\\-\\d+){0,1}\\|\\d+\\|\\d+\\|[YN]{1}\\](,\\[\\d+(\\-\\d+){0,1}\\|\\d+\\|\\d+\\|[YN]{1}\\])*\\z";
Pattern pattern = Pattern.compile(inputString);
Matcher matcher = pattern.matcher(regex);
boolean found = false;
while(matcher.find()){
System.out.println("Found at :");
System.out.println("start - " + matcher.start());
System.out.println(", end - " + matcher.end() + ". ");
found = true;
}
if(!found){
System.out.println("no match found");
}
}
public static void main(String[] args){
testRegex("[61|12|6]");
}
我得到的控制台输出:
发现于: 开始 - 17 ,结束 - 18。 发现于: 开始 - 20 ,结束 - 21。 发现于: 开始 - 25 ,结束 - 26。 发现于: 开始 - 30 ,结束 - 31。 发现于: 开始 - 36 ,结束 - 37。 发现于: 开始 - 57 ,结束 - 58。 发现于: 开始 - 60 ,结束 - 61。 发现于: 开始 - 65 ,结束 - 66。 发现于: 开始 - 70 ,结束 - 71。 发现于: 开始 - 76 ,结束 - 77。
答案 0 :(得分:3)
您的代码错误
Pattern pattern = Pattern.compile(inputString);
Matcher matcher = pattern.matcher(regex);
你需要编译模式而不是输入字符串,这应该更好:
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(inputString);
使用“模式”[61|12|6]
,您会找到“1”和“|”在正则表达式。
<强>更新强>
您没有在正则表达式中覆盖输入字符串模式([61|12|6]
),因为您为\\|[YN]
测试的第四部分不是可选的。试试这个:
\\A\\[\\d+(\\-\\d+)?\\|\\d+\\|\\d+(?:\\|[YN])?\\](,\\[\\d+(\\-\\d+)?\\|\\d+\\|\\d+(?:\\|[YN])?\\])*\\z