[英]Java regex with branch selector
有没有办法以某种方式在不同的Java
正则表达式“分支”的同一字段中设置一个值,以便稍后类似 switch 的语句可以识别遵循哪个分支?
例如,在具有 3 个“分支”的PCRE
,例如
(\S+|d+|\s+)
理想的答案是有一个公共变量(例如selector
),该变量将设置为不同的值(例如,“非空格”、“数字”和“空格”),以便像这样的switch
语句
case "non-space":
case "digit":
case "space":
之后可以执行。
该用例与理解Java
正则表达式但不允许执行Java
代码的正则表达式引擎有关,因此如果有答案,它必须完全基于正则表达式。
以上可能无法完成,因此也欢迎任何有关解决方法的建议。 :-)
Java 中没有任何可用的正则表达式选择器。
但是,您的汽车使用Matcher
和组。
Pattern pattern = Pattern.compile("(\\S+)|(\\d+)|(\\s+)");
Matcher m = pattern.matcher(input);
if (m.find()) {
if (m.group(1) != null) { // non-space
}
if (m.group(2) != null) { // digit
}
if (m.group(3) != null) { // space
}
}
在 Java 中,你能得到的最接近的是交替(如你所示)到
执行不同的代码路径。 正则表达式逻辑与 if/then/else 逻辑略有不同。
(?:
(?: # ----------
(?<a> ) # (1)
# do a code
| (?<b> ) # (2)
# do b code
| (?<c> ) # (3)
# do c code
) # ---------
# Common code
)+
PCRE 具有称为条件的附加逻辑。 它最像一个 switch 语句。
(?: # ----------
(?:
(?<a> ) # (1)
| (?<b> ) # (2)
| (?<c> ) # (3)
) # ---------
(?(<a>) # did a match
# do a code
| # else
(?(<b>) # did b match
# do b code
| # else
# do c code
)
)
# Common code
)+
但是,正如您所看到的,这两者之间确实没有区别
语境。
主要且实际上仅用于正则表达式条件 (imo)
作为在代码中的某个点失败或接受匹配的标志。
这使引擎有机会重试不同的组合。 (?(<a>)|(?!))
请记住,使用断言将大大有助于注入逻辑
进入代码。 这在 Java 引擎中可用。
PCRE也有可以调用的函数调用构造
如果需要进行平衡的文本匹配,则递归。 然而,这并不是
在 Java 中可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.