0

我正在尝试从具有两种不同类型字符的文本中提取字符串。字符是|#,文本来自外部来源。

我给你举个例子:

  • 输入:#hello|#what|whatsup|应该返回hello|whatsup
  • 输入:#hello#应该返回hello
  • 输入:|ola|1应该返回ola
  • 输入:|hello#|what#whatsup#node应该返回hello#whatsup
4

3 回答 3

0

由于#||##||MiddleRecursion||##||#--> ||##||MiddleRecursion||##||,恐怕您必须进行括号匹配。在这种情况下,将没有使用正则表达式的通用解决方案(如果您知道 | 和 # 的最大连续出现次数,则可以强制它工作)。原因是,有中间递归;正则表达式只能解决左递归或右递归。

这也是使用正则表达式无法进行 HTML 解析的原因之一

于 2012-05-26T15:30:28.633 回答
0

好的,我要开始了。

所以你必须匹配#something# 或|something|

你能写两个独立的正则表达式来做到这一点吗?

你首先会生气的地方是管道|是正则表达式中的一个神奇字符。如果你想匹配那个字符,你必须\\按照我链接的另一个线程在它前面加上前缀。

当你有这两个正则表达式工作时,让我知道,我会发布更多。

(我要出去几个小时……)

于 2012-05-26T15:35:16.327 回答
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
     }

更新:我刚刚阅读了中间递归示例。恐怕不行,而且我必须离开我的电脑一段时间。所以这只是让你开始的东西。

适用于所有示例的更新版本:

     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));
     }
于 2012-05-26T16:09:30.697 回答