我需要建立一个能识别以下3种情况的java正则表达式:
或
或
我将列出我到目前为止所尝试的内容以及出现的错误。
public static final VALID_STRING = "[ACTGactg:]*";
// Matches the first case but not the second or third
// as expected.
public static final VALID_STRING = "\\?|[ACTGactg:]*";
// Matches all 3 conditions when my understanding leads me to
// believe that it should not except the third case of "NTC"
public static final VALID_STRING = "?|[ACTGactg:]*";
// Yields PatternSyntaxException dangling metacharacter ?
我希望准确的是以下内容:
public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]*";
但我想确保如果我拿走“NTC”,任何“NTC”字符串都会显示为无效。
以下是我用来测试这些正则表达式的方法。
private static boolean isValid(String thisString){
boolean valid = false;
Pattern checkRegex = Pattern.compile(VALID_STRING);
Matcher matchRegex = checkRegex.matcher(thisString);
while (matchRegex.find()){
if (matchRegex.group().length != 0){
valid = true;
}
}
return valid;
}
所以这是我的结束问题:
可以“\\?”正则表达式可能是一个接受“NTC”字符串的外卡字符吗?
是运算符“|”适合吗?
使用这些或运算符时是否需要使用括号?
以下是一些示例传入字符串:
谢谢
答案 0 :(得分:2)
是的,所提供的正则表达式是可以的:
public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]+";
...
boolean valid = str.matches(VALID_STRING);
如果从正则表达式中删除NTC|
,则字符串NTC将变为无效。
您可以对其进行测试并亲自体验here。
答案 1 :(得分:2)
由于您使用的是Matcher.find()
方法,因此您需要在字符串中的任何位置查找您的模式。
这意味着字符串A:C
,T:G
,AA:CC
等完全匹配。但NTC
怎么样?
匹配是因为find()
在任何地方寻找匹配。它的TC
部分匹配,因此您获得true
。
如果您只想完整匹配字符串,请使用match()
方法,或使用^
和$
。
请注意,如果您将模式更改为[ACTGactg:]+
而不是[ACTGactg:]*
,则无需检查匹配是否超过0。