假设我有一个匹配十六进制32位数的正则表达式:
([0-9a-fA-F]{1,8})
Run Code Online (Sandbox Code Playgroud)
当我构建一个正则表达式,我需要多次匹配,例如
(?<from>[0-9a-fA-F]{1,8})\s*:\s*(?<to>[0-9a-fA-F]{1,8})
Run Code Online (Sandbox Code Playgroud)
我是否每次都必须重复子表达式定义,或者有没有办法"命名和重用"它?
我会想象(警告,发明语法!)
(?<from>{hexnum=[0-9a-fA-F]{1,8}})\s*:\s*(?<to>{=hexnum})
Run Code Online (Sandbox Code Playgroud)
where hexnum=将定义子表达式"hexnum",{= hexnum}将重用它.
因为我已经了解它很重要:我正在使用.NET System.Text.RegularExpressions.Regex,但一般的答案也会很有趣.
Bee*_*jor 11
如果要多次使用子表达式而不重写它,可以对其进行分组,然后将其作为子例程调用.子程序可以通过名称,索引或相对位置来调用.
PCRE,Perl,Ruby,PHP,Delphi,R等支持子程序.遗憾的是,缺少.NET Framework,但是您可以使用一些用于.NET的PCRE库(例如https://github.com/ltrzesniewski/pcre-net).
以下是子程序的工作原理:假设您有一个[abc]要连续重复三次的子表达式.
标准RegEx
任何:[abc][abc][abc]
子程序,按名称
Perl: (?'name'[abc])(?&name)(?&name)
PCRE:(?P<name>[abc])(?P>name)(?P>name)
Ruby: (?<name>[abc])\g<name>\g<name>
Subprine,由Index
Perl/PCRE:([abc])(?1)(?1)
Ruby: ([abc])\g<1>\g<1>
子程序,由相对位置
Perl: ([abc])(?-1)(?-1)
PCRE:([abc])(?-1)(?-1)
Ruby: ([abc])\g<-1>\g<-1>
子程序,预定义
这定义了一个子程序而不执行它.
的Perl/PCRE:(?(DEFINE)(?'name'[abc]))(?P>name)(?P>name)(?P>name)
匹配有效的IPv4地址字符串,范围为0.0.0.0到255.255.255.255:
((?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.(?1)\.(?1)\.(?1)
没有子程序:
((?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.((?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.((?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.((?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))
并解决原贴问题:
(?<from>(?P<hexnum>[0-9a-fA-F]{1,8}))\s*:\s*(?<to>(?P>hexnum))
http://regular-expressions.info/subroutine.html
http://regex101.com/
如果我正确理解你的问题,你想重用某些模式来构建更大的模式吗?
string f = @"fc\d+/";
string e = @"\d+";
Regex regexObj = new Regex(f+e);
Run Code Online (Sandbox Code Playgroud)
除此之外,仅当您尝试匹配与之前在正则表达式中某处匹配的完全相同的字符串时,使用反向引用才会有帮助。
例如
/\b([a-z])\w+\1\b/
Run Code Online (Sandbox Code Playgroud)
只会匹配上面文本中的 : text:spaces
这是示例文本,不是标题,因为它不以 2 个空格结尾。
| 归档时间: |
|
| 查看次数: |
4890 次 |
| 最近记录: |