使用正则表达式从两种不同类型的字符中提取文本

时间:2012-05-26 15:15:49

标签: java regex

我试图从包含两种不同类型字符的文本中提取字符串。 字符为|#,文字来自外部来源。

我会举个例子:

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

3 个答案:

答案 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));
     }