我正在尝试从具有两种不同类型字符的文本中提取字符串。字符是|
和#
,文本来自外部来源。
我给你举个例子:
- 输入:
#hello|#what|whatsup|
应该返回hello|
和whatsup
。 - 输入:
#hello#
应该返回hello
- 输入:
|ola|1
应该返回ola
- 输入:
|hello#|what#whatsup#node
应该返回hello#
和whatsup
由于#||##||MiddleRecursion||##||#
--> ||##||MiddleRecursion||##||
,恐怕您必须进行括号匹配。在这种情况下,将没有使用正则表达式的通用解决方案(如果您知道 | 和 # 的最大连续出现次数,则可以强制它工作)。原因是,有中间递归;正则表达式只能解决左递归或右递归。
这也是使用正则表达式无法进行 HTML 解析的原因之一。
好的,我要开始了。
所以你必须匹配#something# 或|something|
你能写两个独立的正则表达式来做到这一点吗?
你首先会生气的地方是管道|
是正则表达式中的一个神奇字符。如果你想匹配那个字符,你必须\\
按照我链接的另一个线程在它前面加上前缀。
当你有这两个正则表达式工作时,让我知道,我会发布更多。
(我要出去几个小时……)
这适用于您的字符串。我不知道我是否完全理解您的需求,但我认为如有必要可以对其进行调整:
String s1 = "#hello|#what|whatsup|";
String s2 = "#hello#";
String s3 = "|ola|1";
String s4 = "|hello#|what#whatsup#node";
Pattern pattern = Pattern.compile("((\\w)+)(\\||#)(\\||#)?");
Matcher matcher = pattern.matcher(s4);
while(matcher.find()) {
System.out.println(matcher.group(1) + (matcher.group(4) != null ? matcher.group(4).equals("|")? "#" : "|" : ""));
matcher.find(); //to jump over the next match
}
更新:我刚刚阅读了中间递归示例。恐怕不行,而且我必须离开我的电脑一段时间。所以这只是让你开始的东西。
适用于所有示例的更新版本:
String s1 = "#hello|#what|whatsup|";
String s2 = "#hello#";
String s3 = "|ola|1";
String s4 = "|hello#|what#whatsup#node";
String s5 = "#||##||MiddleRecursion||##||#";
Pattern pattern = Pattern.compile("(#|\\|)((#|\\|)*\\w+(#|\\|)*)(#|\\|)");
Matcher matcher = pattern.matcher(s1);
while(matcher.find()) {
System.out.println(matcher.group(2));
}