【发布时间】:2017-11-12 08:06:22
【问题描述】:
示例 php 正则表达式(如下)使用子例程调用来工作。
如果我尝试将它与 C# Regex 类一起使用,我会收到错误:Unrecognized grouping construct
是否可以将其重写为 C# 正则表达式语法?
是简单的翻译,还是需要使用其他(正则表达式)方法?
如果不可能,它正在使用的东西的名称是什么,所以我可以将它添加到这个问题中,以使其对其他有同样问题的人更有用?
适用于所有 json RFC 测试数据的 PHP
$pcre_regex = '
/
(?(DEFINE)
(?<number> -? (?: [1-9]\d*| 0 ) (\.\d+)? (e [+-]? \d+)? )
(?<boolean> true | false | null )
(?<string> " (?>[^"\\\\]+ | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )
(?<array> \[ (?: (?&json) (?: , (?&json) )* )? \s* \] )
(?<pair> \s* (?&string) \s* : (?&json) )
(?<object> \{ (?: (?&pair) (?: , (?&pair) )* )? \s* \} )
(?<json> \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )
)
\A (?&json) \z
/six
';
并且不能在 C# 中工作
string pattern = @"(?(DEFINE)
(?<number> -? (?: [1-9]\d* | 0 ) (\.\d+)? (e [+-]? \d+)? )
(?<boolean> true | false | null )
(?<string> "" (?>[^""\\\\]+ | \\\\ [""\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* "" )
(?<array> \[ (?: (?&json) (?: , (?&json) )* )? \s* \] )
(?<pair> \s* (?&string) \s* : (?&json) )
(?<object> \{ (?: (?&pair) (?: , (?&pair) )* )? \s* \} )
(?<json> \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* ))
\A (?&json) \z
";
string input = @"[{\"Example\": \"data\"}]";
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline;
bool isValid = Regex.IsMatch(input, pattern, options);
编辑:这个问题不是关于在 json 中使用正则表达式,而是关于如何在 C# 中做某事(子例程调用),这可以在 PHP 正则表达式中完成
仅仅因为在 C# 中有一种解析 json 的方法不回答了这个问题。请保持你的答案和主题。
【问题讨论】:
-
您应该在 html 中使用正则表达式。 html 不是常规的,而正则表达式用于常规文本。在类中使用 html 类和方法。
-
当您简化正则表达式以查找引发错误消息的构造时,您发现了什么?请阅读minimal reproducible example 和其他help center 页面。
-
FWIW json 足够规则,可以与(某些)现代正则表达式引擎一起使用请参阅:stackoverflow.com/a/3845829/309634
-
不可能使用单个正则表达式,因为递归是不可能的。即使使用平衡组也不能提供递归的所有功能。我能够创建一个 99% 的正则表达式,但它不能做的是匹配数组内的嵌套对象,因为它不能递归子组(数组)中的父组(对象)
-
@DarcyThomas:好的,关于“数字”子模式,使用前瞻测试是愚蠢的,因为您可以直接匹配数字的开头。此外,由于整个模式不区分大小写,因此无需编写:
[eE]。关于“字符串”子模式,如果您想获得灾难性回溯(例如带有不带右引号的字符串)。结束\Z是一行的结尾,\z是字符串的结尾。