我正在使用Pentaho,它使用Java regex包:java.util.regex。
我想从字符串开头和结尾的文本文件行中提取大量信息:
^StartofString Controls\(param1="(D[0-9]{0,})",param2="(G[0-9]{0,})",param3="([^"]{0,})",param4="([^"]{0,})"\):(?:.*)param5="([^"]{0,})",.*
我想忽略字符串的很长一部分并尝试使用(?:.*)
当我在步骤上测试Regex但在执行转换时不起作用时,积极的前瞻似乎有效。 我在“正则表达式评估”步骤中测试字符串,使用“过滤行”检查上一步的布尔值并在Javascript步骤中提取组:
var pattern = Packages.java.util.regex.Pattern.compile(patternStr);
var matcher = pattern.matcher(content.toString());
var matchFound = matcher.find();
使用patterStr与“正则表达式评估”步骤中的正则表达式相同但使用转义字符:\
我已经阅读了许多关于在正则表达式中忽略字符串部分的问题但仍无法找到答案。 欢迎任何帮助。 如果需要,我可以提供更多信息。
答案 0 :(得分:1)
非捕获组并不意味着其内容不会被捕获,这意味着它不会被捕获在一个组中(尽管您仍然在分组中使用了令牌)正则表达式,可以立即对它们应用修饰符。)
例如,这些正则表达式将匹配完全相同的abc
字符串:
abc
a(?:b)c
a(b)c
然而,在第三种情况下,您已经定义了一个捕获组,使您可以独立访问b
。前两个案例在所有方面都是平等的。
当您想要将修改器应用于一组令牌而没有您可以在以后引用的额外组时,非捕获组会变得非常有用。以下正则表达式将匹配相同的字符串:
(ab)*(c)\2
(?:ab)*(c)\1
我们希望将*
应用于ab
令牌。要么我们使用捕获组(第一个示例),要创建一个我们可以引用的组,或者我们使用非捕获组。正则表达式末尾的反向引用应该与c
匹配;在第一个示例中,它是第二个组,因为ab
是第一个组,而在第二个c
中是第一个可以引用的组。
现在,我已经解释了非捕获群体的作用,让我们解决您的问题:您想从字符串中间删除一些内容,在那里您知道开头的内容是什么以及最后的事情。
假设您要匹配的字符串如下:
Aremove-thisB
您想要结果AB
。
有多种策略可以这样做,最简单的方法可能是在自己的捕获组中匹配字符串的开头和结尾,并从那里创建输出:
var pattern = Packages.java.util.regex.Pattern.compile("(A).*(B)");
var matcher = pattern.matcher(content.toString());
var matchFound = matcher.find();
if (matchFound) { return matcher.group(1) + matcher.group(2); }