想象一下这些字符串:
String s = "firstpartie_FOO_lastpartieofthestring"
或
String s = "lllalal_FOOBBARR_lastpartieofthestringofthedead"
使用regexp,我想在第二个" _"之后提取字符串。
我试过这个:
Pattern p = Pattern.compile("(?<=_[A-Z]*_)");
Matcher m = p.matcher("lllalal_FOOBBARR_lastpartieofthestringofthedead")
但是如何完成正则表达式以提取字符串&#34; lastpartieofthestringofthedead&#34; ?
答案 0 :(得分:3)
如果您想修复方法,请使用捕获组捕获字符串的其余部分:
String s = "lllalal_FOOBBARR_lastpartieofthestringofthedead";
Pattern p = Pattern.compile("^[^_]*_[^_]*_(.*)", Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group(1));
}
// => lastpartieofthestringofthedead
请参阅Java demo
此处^[^_]*_[^_]*_(.*)
匹配字符串(^
)的开头,0 {c}}以外的{+ 1}} _
,[^_]*
,0 +除_
和_
以外的字符,然后将字符串的其余部分捕获到第1组(使用_
)。
否则,使用(.*)
分成3部分:
_
请参阅another demo
答案 1 :(得分:1)
试试这个,它会查找任意数量的字符,然后是_
,然后是_
后面的其他数量的字符,并捕获其他所有内容:
.*_.*_(.*)
关于Regex101的一个例子:
答案 2 :(得分:0)
我发现了这种方式:
Pattern p = Pattern.compile("_[A-Z]*_(.*)");
我在正则表达式研究中取得进展嗨嗨; - )
说明:
...在下划线后跟任意数字(使用星号)的大写字符=&gt; [A-Z] *,后跟另一个下划线=&gt; _ [A-Z] * _
...,捕获所有字符=&gt; (。*)
在此处查找示例:https://ideone.com/S5WJMr