C# 正则表达式-避免字符
在C#中使用一些正则表达式时,我面临以下问题: 考虑这个简单的字符串:~0~这是一个简单的文本~POP~NIZ~0~0~ 我想选择两个“~”之间的任何字符串,其中包含超过3个字符,当然“~”除外。在我的例子中,问题是: 这是一个简单的文本 我可以做这样的东西:([\w][\d].[\124;,…){4-500} 我会以一个很长的正则表达式结束,无法调试,也不可读 相反,我更喜欢创建一个正则表达式,比如“给我任何字符,除了包含在“~”和“~”之间的“~” 我找不到正确使用[^]的方法 我该怎么做 提前谢谢 回答:我终于做到了:~[^~]{3,}~ 除了包含在两个“~”之间的“~”之外,它需要所有东西,长度超过三个字符。C# 正则表达式-避免字符,c#,regex,regex-negation,C#,Regex,Regex Negation,在C#中使用一些正则表达式时,我面临以下问题: 考虑这个简单的字符串:~0~这是一个简单的文本~POP~NIZ~0~0~ 我想选择两个“~”之间的任何字符串,其中包含超过3个字符,当然“~”除外。在我的例子中,问题是: 这是一个简单的文本 我可以做这样的东西:([\w][\d].[\124;,…){4-500} 我会以一个很长的正则表达式结束,无法调试,也不可读 相反,我更喜欢创建一个正则表达式,比如“给我任何字符,除了包含在“~”和“~”之间的“~” 我找不到正确使用[^]的方法 我该怎么做
谢谢你的回答 如果您不介意从开始到结束都有一个可能的额外批次,那么应该尽可能简单:
[^~]{3,}
或者,您也可以拆分并取长的:
var tokens = str.Split('~').Where(s => s.Length >= 3);
如果要将字符限制在特定的集合中,可以使用“向前看”和“向后看”来确保。这不会消耗波浪符号,因此您将获得两个匹配的~123~abc~
(同样,如果您对它感到满意,您可以使用[^~]
):
(?试试这个正则表达式(?:([^~]{3,})~)
它将匹配两个对象之间的所有对象~~~(不会捕捉)类似于:
~([^~]{3}[^~]+)~
(已测试)将整个匹配包在(?:)
中所做的工作很少-语义上完全相同。感谢您的回答!Kobi是对的,您的工作正常,但(?:)似乎没用?你为什么这么说?如果我去掉?:il将捕获2个块'1.~123~和2.123',所以我把?:并使第一个块'non-capturable',无论哪种方式,你都应该得到与Value=~123~
和组[1]的匹配
是两种情况下的全部匹配项。~[^~]{3,}~
可能是错误的-那么~1234~acbd~
呢?您需要两种匹配项吗?您是对的,但我完成了正则表达式以避免这些数字!但是出于示例目的,是的,我不介意这些数字!谢谢您的评论!
~([^~]{3}[^~]+)~