【问题标题】:Search on a particular line using Regular Expression in Java使用 Java 中的正则表达式在特定行上搜索
【发布时间】:2023-03-27 03:41:01
【问题描述】:

我是正则表达式的新手,我的问题可能是非常基本的问题。

我想创建一个可以在特定行号上搜索表达式的正则表达式。

例如。 我有数据

"\nerferf erferfre erferf 12545" + 
"\ndsf erf" + 
"\nsdsfd refrf refref" + 
"\nerferf erferfre erferf 12545" + 
"\ndsf erf" + 
"\nsdsfd refrf refref" + 
"\nerferf erferfre erferf 12545" + 
"\ndsf erf" + 
"\nsdsfd refrf refref" + 
"\nerferf erferfre erferf 12545" + 

我想在第 7 行搜索号码 1234。它也可能出现在其他线路上,也可能不出现。

我试过了

"\\n.*\\n.*\\n.*\\n.*\\n.*\\n.*\\d{4}" 

但我没有得到结果。

请帮我解决正则表达式。

【问题讨论】:

  • 我认为你的换行应该出现在行尾,而不是开始。

标签: java regex


【解决方案1】:

首先,您的newline 字符应放在行尾。这样,描绘特定的线条会更容易。 下面的解释是基于这个修改的。

现在,要到达第 7 行,您首先需要跳过前 6 行,这可以使用 {n,m} 量词来完成。你不需要写.*\n 6 次。所以,应该是这样的:

(.*\n){6}

然后您在第 7 行,您可以在其中匹配所需的数字。那部分会是这样的:

.*?1234

然后匹配文本的其余部分,使用.*

因此,您的最终正则表达式如下所示:

(?s)(.*\n){6}.*?1234.*

所以,只需将此正则表达式使用 String#matches(regex) 方法即可。

附: (?s) 用于启用单行匹配。由于 dot(.) 默认不匹配换行符。

要打印匹配的内容,您可以使用捕获组:

(?s)(?:.*\n){6}.*?(1234).*

如果在组 1 中匹配,这将捕获 1234。虽然这看起来很不寻常,但您捕获了您正在匹配的确切字符串 - 就像捕获 1234 在这里没有意义,因为您知道您正在匹配 1234,而不是针对 \\d,在这种情况下您可能会感兴趣这些数字到底是什么。

【讨论】:

  • 谢谢。对于搜索,它会跳过前 6 行,但在打印时,它也会打印前 6 行。
  • @NiteshGupta。只需捕获您想要在组中打印的任何内容。你还想打印什么?
  • 我们不能只从正则表达式中删除不需要的行吗?只是一个想法。我对正则表达式了解不多。
  • @NiteshGupta。你当然可以,但问题又来了——你只想要第 7 行吗?如果是,则将其捕获在一个组中。而已。我已经稍微修改了我的答案。
  • 请注意 Java 中的 . excludes more than just \n。当前的正则表达式将从整个字符串中排除某些字符(如果重要的话)。还有一点就是你找到1234之后就不需要再搜索了
【解决方案2】:

试试

Pattern p = Pattern.compile("^(\\n.*){6}\\n.*\\d{4}" );
System.out.println(p.matcher(s).find());

【讨论】:

    【解决方案3】:

    这个问题最好不要单独使用正则表达式来解决。首先将字符串拆分为换行符,以获取行数组:

    String[] lines = data.split("\\n");
    

    然后,在第 7 行执行正则表达式:

    try {
        String line7 = lines[6];
        // do something with it
    } catch (IndexOutOfBoundsException ex) {
        System.error.println("Line not found");
    }
    

    希望这是你的开始。

    编辑:我不是正则表达式的专家,但我会尝试这个:

    "(\\n.*){5}(.*)"
    

    对不起,如果这不是正确的 Java 语法,但这应该首先捕获 5 个新行 + 数据,这样就没有了 6 行,数据本身应该在第二个捕获组(包括换行符)中可用。如果要排除前面的换行符:

    "(\\n.*){5}\\n(.*)"
    

    【讨论】:

    • 感谢您的回复。但我正在学习 RegEx,只想用它来解决这个问题。我无法拆分字符串。
    【解决方案4】:

    你可以使用:

    (^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*)(1234)
    

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多