gpt4 book ai didi

c# - 为什么这个正则表达式在 JavaScript 中有效,但在 C# 中无效?

转载 作者:太空狗 更新时间:2023-10-30 00:48:32 24 4
gpt4 key购买 nike

表达式

var regex = new Regex(@"{([A-z]*)(([^]|:)((\\:)|[^:])*?)(([^]|:)((\\:)|[^:])*?)}");

分割

该表达式 [粗略地] 设计用于在输入中查找标记,使用格式:{name[:pattern[:format]]},其中 patternformat 是可选的。

{
([A-z]*) // name
(([^]|:)((\\:)|[^:])*?) // regex pattern
(([^]|:)((\\:)|[^:])*?) // format
}

此外,表达式会尝试忽略转义的冒号,从而允许使用诸如 {Time:\d+\:\d+\:\d+:hh\:mm\:ss} 之类的字符串>

问题

RegExr.com 上测试时,一切正常,但是在 C# 中尝试相同的模式时,输入不匹配,为什么?

(也非常欢迎对表达式进行一般改进的任何建议)

最佳答案

[^] 模式仅在匹配 not nothing 的 JavaScript 中有效,即任何字符(尽管在 ES5 中,它不匹配来自外部的字符BMP 飞机)。在 C# 中,很容易将任何字符与 . 匹配并传递 RegexOptions.Singleline 修饰符。但是,在 JS 中,不支持修饰符,但您可以将任何字符与 [\s\S] 解决方法模式匹配。

因此,要使两者在两种正则表达式风格中兼容,您需要做的最小更改是将 ([^]|:) 更改为 [\s\S] 因为不需要使用 : 作为替代(因为 [\s\S] 已经匹配冒号)。

此外,不要使用 [A-z] 作为匹配 ASCII 字母的快捷方式。使用 [a-zA-Z][a-z] 并传递不区分大小写的修饰符。

因此,您可以考虑将表达式写成

{([A-Za-z]*)([\s\S]((\\:)|[^:])*?)([\s\S]((\\:)|[^:])*?)}

查看 .NET regex test和一个 JS regex test .

当然,这里可能还有其他增强功能:删除冗余组、添加对任何转义序列(不仅仅是转义冒号)的支持等,但这不在问题范围内。

关于c# - 为什么这个正则表达式在 JavaScript 中有效,但在 C# 中无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45823146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com