我有一个解析器,它对给定的字符串应用正则表达式规则。 删除每个规则的第一个匹配项并将其放入节点中。
其中一条规则试图找到变量,这些变量介于仅由数字,字母,下划线和短划线组成的|
符号之间。
执行此操作的规则如下:(?:\|)[a-zA-Z0-9_-]+(?:\|)+?
例如,我们有以下表达式:part1+250+|part2|+part3
它匹配|part2|
这是一个变量。
现在我需要另一个匹配常量的规则,它只能由(数字,字母,下划线,短划线和空格)组成。 但它应该不匹配变量。
看一下相同的示例表达式,它应该匹配以下内容:
part1
,250
,part3
它应匹配任何(数字,字母,空格,下划线,短划线),|
符号之间不。
如何使用单个正则表达式来实现此目的?
答案 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
并推断是否有“变量”,“常量”或者没有找到任何内容。答案 1 :(得分:0)
String[] split = s.replaceAll("\\|\\w+\\|", "").replaceAll("\\W+", "-").split("-");
这将包含您的所有需求