Java Regex匹配与给定模式匹配的任何内容,并且不在给定字符之间

时间:2014-10-16 10:33:20

标签: java regex

我有一个解析器,它对给定的字符串应用正则表达式规则。 删除每个规则的第一个匹配项并将其放入节点中。

其中一条规则试图找到变量,这些变量介于仅由数字,字母,下划线和短划线组成的|符号之间。 执行此操作的规则如下:(?:\|)[a-zA-Z0-9_-]+(?:\|)+?

例如,我们有以下表达式:part1+250+|part2|+part3 它匹配|part2|这是一个变量。

现在我需要另一个匹配常量的规则,它只能由(数字,字母,下划线,短划线和空格)组成。 但它应该匹配变量。

看一下相同的示例表达式,它应该匹配以下内容: part1250part3 它应匹配任何(数字,字母,空格,下划线,短划线),|符号之间

如何使用单个正则表达式来实现此目的?

2 个答案:

答案 0 :(得分:1)

以下是您的解决方案的单一模式实现:

String input = "part1+250+|part2|+part3";

Pattern p = 
//                   | group 1 ("variable")
//                   | | positive look behind for "|"
//                   | |      | character class for allowed characters
//                   | |      |             | quantifier for 1+ instance, greedy
//                   | |      |             | | positive lookahead for "|"
//                   | |      |             | |      | OR
//                   | |      |             | |      || group 2 ("constant") 
//                   | |      |             | |      ||| negative lookbehind for "|"
//                   | |      |             | |      |||       | allowed chars
//                   | |      |             | |      |||       |             | quantifier
//                   | |      |             | |      |||       |             | | negative
//                   | |      |             | |      |||       |             | | lookahead
//                   | |      |             | |      |||       |             | | 
    Pattern.compile("((?<=\\|)[ a-zA-Z0-9_-]+(?=\\|))|((?<!\\|)[ a-zA-Z0-9_-]+(?!\\|))");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.printf("Variable: %s%nConstant: %s%n", m.group(1), m.group(2));
}

<强>输出

Variable: null
Constant: part1
Variable: null
Constant: 250
Variable: part2
Constant: null
Variable: null
Constant: part3

备注

  • 这里打印所有内容,但您当然可以检查null并推断是否有“变量”,“常量”或者没有找到任何内容。
  • 这里有快速解决方案,因此可能没有覆盖边缘情况。
  • 这里的分组是Java 6的样式,以实现向后兼容性。 Java 7的命名组虽然更有趣!

答案 1 :(得分:0)

String[] split = s.replaceAll("\\|\\w+\\|", "").replaceAll("\\W+", "-").split("-");

这将包含您的所有需求