【问题标题】:Regex to check the start of String exactly once正则表达式只检查一次字符串的开头
【发布时间】:2013-12-21 13:20:08
【问题描述】:

我有一个字符串,我想使用正则表达式在其中匹配 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}.*$

谁能告诉我使用正则表达式的解决方案吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

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

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

    如果您确实希望 TRUE 指示 B1/B2 不会出现两次,那么有点混乱导致我这样做了:

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

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

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

    【讨论】:

    • 注意到您正在使用 .matches() 方法 - 这需要整个字符串匹配。更新了我的答案以反映这一点。
    【解决方案2】:

    对于恰好一次不匹配使用此模式,它将匹配行首 (?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

    【讨论】:

      【解决方案3】:

      regex 会检测您不需要的情况。注意使用两个标志:m(多行)和s(单行 - 点匹配换行符):

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

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

      【讨论】:

      • 嗯...为什么要投反对票? (以及这种情况在例外答案上发生的频率如何?!)如果我的答案需要改进,我当然会接受建议。
      猜你喜欢
      • 1970-01-01
      • 2012-08-05
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2011-09-16
      相关资源
      最近更新 更多