为什么我的RegEx根据平台获得两种不同的结果?

mak*_*iuk 3 .net c# regex

我有一个RegEx模式:

@"((?(?!\.\d)\D)*)(\d*\.\d+|\d+)*((?(?<=\d).*))"
Run Code Online (Sandbox Code Playgroud)

旨在将字符串分成3个部分.如果我有字符串

"asdf1234asdf"
"asdf .1234asdf"
"asdf. .1234asdf"
"asdf 12.34asdf"
"asdf123.4 asdf"
"asdf.1234asdf"
Run Code Online (Sandbox Code Playgroud)

我需要:

1. "asdf"     2. "1234"    3. "asdf"
1. "asdf "    2. ".1234"   3. "asdf"
1. "asdf. "   2. ".1234"   3. "asdf"
1. "asdf "    2. "12.34"   3. "asdf"
1. "asdf"     2. "123.4"   3. " asdf"
1. "asdf"     2. ".1234"   3. "asdf"
Run Code Online (Sandbox Code Playgroud)

但根据我使用的平台,结果会发生变化.

Regex101.com给了我需要的结果

虽然在Regexstorm.com中我必须将正则表达式中的if语句修改为非捕获组才能使其工作

即:我需要改变它

@"((?(?!\.\d)\D)*)(\d*\.\d+|\d+)*((?(?<=\d).*))"
Run Code Online (Sandbox Code Playgroud)

@"((?:(?!\.\d)\D)*)(\d*\.\d+|\d+)*((?(?<=\d).*))"
Run Code Online (Sandbox Code Playgroud)

让它工作 .NET

那么为什么我需要摆脱'if'块?不.NET,如果块不支持?

Sam*_*Sam 5

RegEx更像英语,而不是C#.它是一种用于定义模式的语言,可以在字符串中找到匹配项.每种语言都需要实现它们的正则表达式引擎,因此大多数语言之间存在差异,而概念基本保持不变.通常,表达越复杂,越不可能跨平台兼容.这就是为什么每个人都会询问SO用户在询问含糊的RegEx问题时使用的编程语言.

这就是像RegEx101这样的工具需要有多种"风味"来彻底测试表达式的原因.当您在引擎之间切换时,您还会注意到"快速参考"内容(包含令牌,量词等的备忘单)的变化.

维基百科: 正则表达式引擎的比较.