Regex 在特殊条件下以相同字符串开头和结尾的正则表达式

Regex 在特殊条件下以相同字符串开头和结尾的正则表达式,regex,Regex,我需要一种机制来查找由非数字字符包围的字符串中的数字,或者字符串的开始/结束,或者在本例中是一个特殊的分隔符43。以下是一些例子: 订单号12345678 12345678 12345678标签 431234567843 所有这些都将导致12345678的匹配。目前我正在使用以下正则表达式: (?<=^|\D|43)([0-9]{8})(?=$|\D|43) 这个表达式工作得很好,但有一个缺陷。如果数字以43开头,但不以43结尾,我也会得到一个肯定的结果。以下是我得到这些“错误”结果的示

我需要一种机制来查找由非数字字符包围的字符串中的数字,或者字符串的开始/结束,或者在本例中是一个特殊的分隔符43。以下是一些例子:

订单号12345678 12345678 12345678标签 431234567843 所有这些都将导致12345678的匹配。目前我正在使用以下正则表达式:

(?<=^|\D|43)([0-9]{8})(?=$|\D|43)
这个表达式工作得很好,但有一个缺陷。如果数字以43开头,但不以43结尾,我也会得到一个肯定的结果。以下是我得到这些“错误”结果的示例:

4312345678 4312345678标签
我现在需要的是一个结构,让正则表达式知道匹配字符串是否以43开头,然后如果它也以43结尾,则仅将其作为阳性结果返回。

您可以在lookback中使用阳性的先行检查:

(?<=^|\D|43(?=[0-9]{8}43))[0-9]{8}(?=43|\D|$)
           ^^^^^^^^^^^^^^
下面是一个在测试.NET正则表达式时非常有用的示例

有关以下内容的一些背景信息:

此语言元素尝试匹配两个模式中的一个,这取决于它是否可以匹配初始模式。其语法是:

??表达式是|否

其中expression是要匹配的初始模式,yes是匹配表达式时要匹配的模式,no是不匹配表达式时要匹配的可选模式。正则表达式引擎将表达式视为零宽度断言;也就是说,正则表达式引擎在计算表达式后不会在输入流中前进


因此,Lookback中的43被捕获到组1中,然后,在条件中,143 |?:[^0-9]|$,1检查组1是否匹配,如果匹配,则43匹配,否则,:[^0-9]|$尝试任何非数字或字符串结尾。

您可以在Lookback中使用正向前瞻检查:

(?<=^|\D|43(?=[0-9]{8}43))[0-9]{8}(?=43|\D|$)
           ^^^^^^^^^^^^^^
下面是一个在测试.NET正则表达式时非常有用的示例

有关以下内容的一些背景信息:

此语言元素尝试匹配两个模式中的一个,这取决于它是否可以匹配初始模式。其语法是:

??表达式是|否

其中expression是要匹配的初始模式,yes是匹配表达式时要匹配的模式,no是不匹配表达式时要匹配的可选模式。正则表达式引擎将表达式视为零宽度断言;也就是说,正则表达式引擎在计算表达式后不会在输入流中前进

因此,Lookback中的43被捕获到组1中,然后,在条件中,143 |?:[^0-9]|$,1检查组1是否匹配,如果匹配,则43匹配,否则,:[^0-9]|$尝试任何非数字或字符串结尾。

您可以使用:

这样做的目的是将有条件的文本?1a | b替换为如下交替:text?:\1a |\1b

您可以使用:


这样做的目的是将有条件的文本?1a | b替换为如下交替:text?:\1a |\1b

仅供参考:Java正则表达式引擎不支持条件,请参阅。我认为基于前瞻性的解决方案更具跨平台兼容性。事实上,我先写了一个有条件的正则表达式,并将其包含在我自己的答案中,但你将其作为另一个答案发布。@WiktorStribiżew我不知道。添加了解决方法。仅供参考:Java正则表达式引擎不支持条件,请参阅。我认为基于前瞻性的解决方案更具跨平台兼容性。事实上,我先写了一个有条件的正则表达式,并将其包含在我自己的答案中,但你将其作为另一个答案发布。@WiktorStribiżew我不知道。增加了解决方法。
(?<=^|\D|(43))[0-9]{8}(?(1)(?=43)|(?=$|\D))
(?<=^|\D|()43)[0-9]{8}(?=(?:\1(?:43)|(?!\1)(?:\D|$)))