我试图从包含两种不同类型字符的文本中提取字符串。
字符为|
和#
,文字来自外部来源。
我会举个例子:
#hello|#what|whatsup|
应返回hello|
和whatsup
。#hello#
应返回hello
|ola|1
应返回ola
|hello#|what#whatsup#node
应该返回hello#
和whatsup
答案 0 :(得分:0)
自#||##||MiddleRecursion||##||#
- > ||##||MiddleRecursion||##||
,我担心你必须做括号匹配。在这种情况下,没有使用正则表达式的通用解决方案(如果您知道|和#的最大连续外观,则可以强制它工作)。原因是,有中间递归;正则表达式只能解决左或右递归问题。
这也是一个为什么无法使用正则表达式进行HTML解析的原因。
答案 1 :(得分:0)
好的,我会开始的。
所以你必须匹配#something#或| something |
你能写两个单独的正则表达式吗?
首先让你恼火的是管道|
是regexp中的魔术角色。如果您想匹配该字符,则必须根据我链接的其他主题为\\
添加前缀。
当你有两个正则表达式工作时,请告诉我,我会发布更多。
(我要出去几个小时......)
答案 2 :(得分:0)
这适用于您的字符串。我不知道我是否完全理解你需要什么,但我认为如果有必要可以调整它:
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
}
更新: 我刚刚阅读了midrecursion示例。我不敢这样做,我不得不离开我的电脑一段时间。所以这只是让你入门的事情。
更新适用于所有示例的版本:
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));
}