2013-04-22 53 views
4

我是新的正则表达式,可能是我的问题是非常基本的。在Java中使用正则表达式在特定行上搜索

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

例如。 我有数据

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

我想搜索关于七号线数1234。它可能也可能不会出现在其他行上。

我试图与

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

,但我没有得到结果。

请帮我拿出正则表达式。

+1

我认为你应该换行来在该行的末尾,而不是在开头。 – 2013-04-22 10:52:35

回答

5

首先,你的性格newline应放置在线条的末端。这样,描绘一条特定的线会更容易。 下面的解释是基于这种修改。

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

(.*\n){6} 

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

.*?1234 

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

所以,你最终的正则表达式将是这样的:

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

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

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

要打印的东西你匹配,你可以使用捕捉组:

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

这将捕获1234如果组1匹配。虽然它看起来很不寻常,但是您捕捉到的是一个完全匹配的字符串 - 例如捕获1234在这里没有意义,因为您知道您匹配的是1234,而不是针对\\d,在这种情况下,您可能会对这些数字。

+0

谢谢。为了搜索它正在跳过前6行,但是当它正在打印时,它也打印了前六行。 – 2013-04-22 11:08:46

+0

@NiteshGupta。只要抓住你想要在一个组中打印的任何东西。你想打印什么? – 2013-04-22 11:11:26

+0

我们不能仅从正则表达式中删除不需要的行。只是一个想法。我对正则表达式不太了解。 – 2013-04-22 11:13:24

1

这个问题最好不要用regex单独解决。通过在一个换行符拆分字符串开始,得到线的阵列:

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个新线+数据,所以这六行消失了,数据本身应该在第二个捕获组(包括换行符)中可用。如果要排除在前面的换行:

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

感谢您的回复。但我正在学习正则表达式,只想解决这个问题。我无法拆分字符串。 – 2013-04-22 10:48:49

+0

@NiteshGupta我在我更新的答案中做了一个尝试。 – MarioDS 2013-04-22 10:53:38

2

尝试

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

您可以使用:

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