我有一个包含字符串的文本字段"是"或"否"
我需要一个正则表达式,它只允许其中一个字符串。即文本应该只包含一个字符串,"是"或"否"。该文本不应包含"是"和"不"。
(^((?!.*No).*Yes.*)$)|(^((?!.*Yes).*No.*)$)
例如:
Yes, correct = allow this
No, Incorrect = allow this
Yes, correct- No Incorrect = Don't allow this
我试过这个。但这是允许两者。任何帮助表示感谢。
答案 0 :(得分:1)
这个愚蠢的长正则表达式将为你做到:P
public static void main(String[] args) throws IOException, InterruptedException {
String s = "Yes, correct- No Incorrect";
System.out.println(s.matches("(?=.*(?<![a-zA-Z])Yes(?![a-zA-Z]))(?=.*(?<![a-zA-Z])No(?![a-zA-Z])).*"));
}
O / P:
true
PS:使用?i
使正则表达式不区分大小写。
上面的代码检查是和否,并确保它们不是不同单词的一部分(如昨天或任何人)
答案 1 :(得分:1)
您可以使用模式:
^((?:(?!No).)*Yes(?:(?!No).)*|(?:(?!Yes).)*No(?:(?!Yes).)*)$
像这样:
import java.util.regex.Pattern;
public class RegexpYesNo {
static Pattern YesOrNoRegex = Pattern.compile( "^((?:(?!No).)*Yes(?:(?!No).)*|(?:(?!Yes).)*No(?:(?!Yes).)*)$" );
public static boolean containsYesOrNo(
final String input
){
return YesOrNoRegex.matcher( input ).matches();
}
public static void main( final String[] args ){
final String[] tests = {
"Yes, correct = allow this",
"No, Incorrect = allow this",
"Yes, correct- No Incorrect = Don't allow this"
};
for ( final String test : tests )
System.out.println( containsYesOrNo( test ) );
}
}
但是,更简单的方法是不使用正则表达式:
public static boolean containsYesOrNo(
final String input
){
return input.contains( "Yes" ) != input.contains( "No" );
}
答案 2 :(得分:0)
如果您确实需要使用正则表达式,请使用
(?i)^(?!.*(?:\byes\b.*\bno\b|\bno\b.*\byes\b)).*\b(?:yes|no)\b.*
请参阅regex demo
在Java中:
String ptrn = "(?i)^(?!.*(?:\\byes\\b.*\\bno\\b|\\bno\\b.*\\byes\\b)).*\\b(?:yes|no)\\b.*";
如果您的字符串包含换行符号,请添加DOTALL修饰符。
<强>解释强>
(?i)
- 启用不区分大小写的模式^
- 字符串开头(?!.*(?:\byes\b.*\bno\b|\bno\b.*\byes\b))
- 如果整个单词有yes
或no
或no
和yes
(由于字边界{{},则表示匹配失败{1}})稍后在字符串\b
- 匹配除换行符之外的零个或多个字符(不带DOTALL修饰符(.*
- \b(?:yes|no)\b
或yes
no
- 换行符以外的零个或多个字符(不带DOTALL修饰符)