使用Java中的正则表达式在特定行上搜索

时间:2013-04-22 10:40:33

标签: java regex

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

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

例如。  我有数据

"\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 个答案:

答案 0 :(得分:5)

首先,您的newline字符应放在行尾。这样,想象一条特定的线会更容易。 以下说明基于此修改。

现在,要获得第7行,您首先需要跳过前6行,您可以使用{n,m}量词。您不需要写.*\n 6次。那么,就是这样:

(.*\n){6}

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

.*?1234

然后使用.*

匹配其余文本

所以,你的最终正则表达式如下:

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

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

P.S。 (?s)用于启用单行匹配。由于默认情况下为点(.),因此与换行符不匹配。

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

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

如果在组1 中匹配,则会捕获1234。虽然看起来很不寻常,但是你捕获了一个匹配的精确字符串 - 比如捕获1234这里没有任何意义,因为你知道你匹配1234而不是\\d,在哪种情况下,您可能会对这些数字究竟是什么感兴趣。

答案 1 :(得分:2)

尝试

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

答案 2 :(得分: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");
}

希望这是一个开始。

编辑:我不是Regex的专业人士,但我会尝试使用这个:

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

很抱歉,如果这不是正确的Java语法,但是这应该首先捕获5个新行+数据,这样六条线就消失了,数据本身应该在第二个捕获组中可用(包括换行)。如果您想要排除前面的换行符:

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

答案 3 :(得分:0)

您可以使用:

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