我有这样的字符串“first#second”,我想知道如何在没有“#”符号的情况下获得“第二”部分作为RegEx的结果,而不是使用括号进行匹配捕获
upd:我忘了在字符串的末尾添加一个特殊的字符串,真正的字符串是“first#second *”
答案 0 :(得分:5)
如果你必须使用正则表达式,并坚持不使用捕获组,你可以使用lookbehind支持它们的风格:
(?<=#).*
或者除了#
之外,您还可以捕获字符串末尾的任何内容,如下所示:
[^#]*$
捕获组选项当然是:
#(.*)
\__/
1
这也与#
匹配,但第1组会捕获您想要的部分。
最后,非正则表达式可能看起来像这样:
secondPart = wholeString.substring( wholeString.indexOf("#") + 1 )
如果#
也可能出现(可能已转义)字符串中的任何其他位置,则某些解决方案可能会出现问题。
答案 1 :(得分:4)
简单的正则表达式:
/#(.*)$/
如果你真的不希望它成为匹配捕获,并且你知道字符串中有#,但你想要的部分中没有#,你可以做到
/[^#]*$/
整个正则表达式都是你想要的。
答案 2 :(得分:2)
/[a-z]+#([a-z]+)/
答案 3 :(得分:2)
您可以使用环视来排除表达式的某些部分。
答案 4 :(得分:1)
如果你使用java那么
你可以考虑使用Pattern&amp;匹配课。 Pattern为您提供正则表达式的编译优化器版本。 Matcher提供了完整的RE匹配内部。
Pattern.match&amp; String.spilt给出相同的结果,其中第一个是分区更快。
例如)
String s = "first#second#third";
String re = "#";
Pattern p = Pattern.compile(re);
Matcher m = p.matcher();
int ms = 0;
int me = 0;
while( m.find() ) {
System.out.println("start "+m.start()+" end "+ m.end()+" group "+m.group());
me = m.start();
System.out.println(s.substring(ms,me));
ms = m.end();
}
如果其他语言你可以考虑使用反向引用&amp;团体也。如果你发现任何重复。