我有一个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)
但根据我使用的平台,结果会发生变化.
虽然在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,如果块不支持?
RegEx更像英语,而不是C#.它是一种用于定义模式的语言,可以在字符串中找到匹配项.每种语言都需要实现它们的正则表达式引擎,因此大多数语言之间存在差异,而概念基本保持不变.通常,表达越复杂,越不可能跨平台兼容.这就是为什么每个人都会询问SO用户在询问含糊的RegEx问题时使用的编程语言.
这就是像RegEx101这样的工具需要有多种"风味"来彻底测试表达式的原因.当您在引擎之间切换时,您还会注意到"快速参考"内容(包含令牌,量词等的备忘单)的变化.
维基百科: 正则表达式引擎的比较.
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |