正则表达式只允许两者中的一种模式

时间:2016-02-10 11:23:34

标签: java regex

我有一个包含字符串的文本字段"是"或"否"

我需要一个正则表达式,它只允许其中一个字符串。即文本应该只包含一个字符串,"是"或"否"。该文本不应包含"是"和"不"。

(^((?!.*No).*Yes.*)$)|(^((?!.*Yes).*No.*)$)

例如:

Yes, correct = allow this

No, Incorrect = allow this

Yes, correct- No Incorrect = Don't allow this

我试过这个。但这是允许两者。任何帮助表示感谢。

3 个答案:

答案 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)) - 如果整个单词有yesnonoyes(由于字边界{{},则表示匹配失败{1}})稍后在字符串
  • \b - 匹配除换行符之外的零个或多个字符(不带DOTALL修饰符(
  • .* - \b(?:yes|no)\byes
  • no - 换行符以外的零个或多个字符(不带DOTALL修饰符)