正则表达式只检查一次String的开始

时间:2013-12-04 20:59:11

标签: java regex

我有一个字符串,我希望使用正则表达式匹配B1和B2中的任何一个只出现一次并且在每个新行的开头。以下是样本和我尝试的内容:

public static String testStr = "A1ABC            10.101.0     testString \r\n"+
                               "B100000100111 B18388831993     I am here\r\n";


public static void main(String args[]) {
    String regex = "^(B1{1}|B2{1}).*$";

    boolean isTrue = testStr.matches(regex);
    if (isTrue) {
        System.out.println("TRUE returns ......... ");
    } else {
        System.out.println("FALSE returns ......... ");
    }
}

在上面的情况下,它应该返回TRUE但是如果我将输入更改为:

public static String testStr = "A1ABC            10.101.0     testString \r\n"+
                               "B100000100111 B18388831993     I am here\r\n"+
                               "B2HELLLOWORLD";

但在上述情况下,它应返回FALSE,因为B1和B2都存在。我想检查B1和B2中的任何一个只在一行开始时出现,而不是介于两者之间。

我也使用正则表达式:

          .*\\r?\\n$^B1{1}.*\\r\\n$ | ^B2{1}.*$

任何人都可以告诉我使用正则表达式的解决方案吗?

3 个答案:

答案 0 :(得分:4)

测试相反的情况更容易,如果TRUE出现两次,则返回B1/B2,然后将结果视为相反的结果:

(?sm).*^(B1|B2).*?^(B1|B2).*

使用多行标记(?m) - RegExr

如果您确实希望TRUE表示B1/B2没有出现两次,那么有点麻烦让我这样:

^(?sm)(?!(.*?^(B1|B2)){2}).*

RegExr - 将一行更改为另一个B1/B2,您会看到它停止匹配。

但是我确信第二个正则表达式的效率远低于仅仅翻转第一个正则表达式的返回值。

答案 1 :(得分:0)

对于完全一次不匹配使用此模式,它将在行(?s)^((?=((^|.*\r?\n)(B1|B2)){2})|^(?!(^|.*\r?\n)(B1|B2))).的开头匹配0和2次或更多次的B1 / B2

  • ^(开始
  • (?=((^|.*\r?\n)(B1|B2)){2})预测B1 / B2“2次出现”
  • |
  • ^(?!(^|.*\r?\n)(B1|B2)) B1 / B2“0发生”的负面预测
  • ).抓一些东西返回1或0

答案 2 :(得分:-1)

正则表达式会检测到您不想要的情况。请注意使用两个标志:m(多行)和s(单行 - 点匹配换行符):

(?ms)^(?:B1|B2).*?^(?:B1|B2)

?:的存在抑制了反对引用的创建。 (您不需要反向引用;您只想知道是否有违反约束的数据。)