我是正则表达的新手,可能是我的问题非常基本。
我想创建一个可以在特定行号上搜索表达式的正则表达式。
例如。 我有数据
"\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}"
但是没有得到结果。
请帮我解决正则表达式。
答案 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)