积极的lookbehind不适用于plus

时间:2014-02-02 21:48:34

标签: regex notepad++

我正在尝试在模式字<Art><dot><digits><dot>

之后选择地点

代码:

Art. 83.
xxx xxx xxx
Art. 3.
xxx xxx xxx

到目前为止,我尝试过这种模式,但是如果为+选择添加\d失败了..为什么?

  

(小于?=艺术.. \ d \ d)。

如何在具有随机数字长度的文本之后选择文本?

编辑1

好的我需要为文本模式Art. <digits length unknown>.

之后的每个文本添加新行

输入

Art. 3.
xxx xxx xxx

输出

Art. 3.

xxx xxx xxx

编辑2

我正在寻找JAVA

中语言Android / Notepad++ /解析器的解决方案

5 个答案:

答案 0 :(得分:3)

你正在使用外观,而不是前瞻,这在大多数实现中都有局限性。来自http://www.regular-expressions.info/lookaround.html

  

坏消息是大多数正则表达式都不允许你在lookbehind中使用任何正则表达式,因为它们不能向后应用正则表达式。正则表达式引擎需要能够在检查lookbehind之前找出要退回的字符数。在评估lookbehind时,正则表达式引擎确定lookbehind内的正则表达式的长度,后退主题字符串中的许多字符,然后从左到右应用正则表达式中的正则表达式,就像使用普通正则表达式一样。 / p>

在您的情况下,也许您可​​以使用与文本匹配的表达式并使用替换中的匹配项。例如,在Java中:

String original = "Art. 3.\nxxx xxx xxx";
String replaced = original.replaceAll("Art\\. \\d+\\.", "$0\n");

答案 1 :(得分:1)

在大多数regex实现中,您无法使用可变长度外观。但是,您应该能够在不看后面的情况下解决这个问题:

# Match your string in a group
/(Art\.\s\d+\.)/g

# Replace and append a new line to $1 match group
$1\n

示例:http://regex101.com/r/fW5jO7

我们不知道您使用的语言,但PHP实现:

preg_replace('/(Art\.\s\d+\.)/', "$1\n", $text);

答案 2 :(得分:0)

在perl:

for (<DATA>) {
  print;
  print("\n") if (/Art\. \d+\./);
}
__DATA__
whatver
stuff
Art. 83.
123 456 789
Art. 3.
987 654 321
more
stuff

答案 3 :(得分:0)

使用分组而不是lookbehind

(Art..\d\d.)(.)

然后获得第2组

答案 4 :(得分:0)

Notepad ++解决方案:

找到:^(Art\.\s*\d+\.)
替换为:$1\n

可能你想要crlf,所以使用:替换为:$1\r\n