5

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

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

例如。我有数据

"\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}" 

但我没有得到结果。

请帮我解决正则表达式。

4

4 回答 4

5

首先,你的newline角色应该放在行尾。这样,描绘特定的线条会更容易。以下解释基于此修改。

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

(.*\n){6}

然后你在第 7 行,在那里你可以匹配你需要的数字。那部分将是这样的:

.*?1234

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

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

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

所以,只需使用String#matches(regex)这个正则表达式的方法。

PS(?s)用于启用单行匹配。由于 dot(.)默认情况下,不匹配换行符。

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

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

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

于 2013-04-22T10:57:01.883 回答
2

尝试

Pattern p = Pattern.compile("^(\\n.*){6}\\n.*\\d{4}" );
System.out.println(p.matcher(s).find());
于 2013-04-22T10:56:31.760 回答
1

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

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(.*)"
于 2013-04-22T10:45:06.483 回答
0

您可以使用:

(^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*\r\n)(^.*)(1234)
于 2013-04-22T11:02:50.177 回答