c#regex匹配一组不重复的字符

c#regex匹配一组不重复的字符,c#,regex,C#,Regex,受到其他问题的启发(我已经接受了非正则表达式的解决方案) 但是@Dmitry Egorov的这个解决方案要优雅得多,我仍然在努力正确地解决它(如果它可以用一个正则表达式解决的话) 最接近的就是这个 ^(.|\n)*<\[SG (?!.*(.).*\2)[msbrelft]+\]>(.|\n)*$ 换句话说,匹配应为: - if this exists anywhere in text <[SG sbl]> including over \n or \r\n - let

受到其他问题的启发(我已经接受了非正则表达式的解决方案)

但是@Dmitry Egorov的这个解决方案要优雅得多,我仍然在努力正确地解决它(如果它可以用一个正则表达式解决的话) 最接近的就是这个

^(.|\n)*<\[SG (?!.*(.).*\2)[msbrelft]+\]>(.|\n)*$
换句话说,匹配应为:

- if this exists anywhere in text <[SG sbl]> including over \n or \r\n
- letters should be in this group of letters [msbrelft]
- must be minimum one letter, eg. <[SG s]>
- can be up to all from group, eg. <[SG sbl]>
- must be only one letter (no duplicates), eg. <[SG sbsl]> is NOT good
-如果此内容存在于文本中的任何位置,包括\n或\r\n
-字母应位于这组字母中[msbrelft]
-必须至少有一个字母,例如。
-可以是团体的所有成员,例如。
-必须只有一个字母(没有重复),例如不好
我不想提取组,只要验证所有文本是否包含前面解释的规则

现在我已经出现了,让我发疯的是

^(.|\n)*<\[SG (?!.*(.).*\2)[msbrelft]+\]>(.|\n)*$
^(.|\n)*(.|\n)*$
这不会验证在我感兴趣的组之后是否有两个字母在同一行(否或\r\n)

例如,这是有效的(组后面有一个\n或\r\n)

ID-CFI位置02h显示ID-CFI输入中使用的扇区地址(SA)所选扇区的扇区保护状态
指挥部。要读取多个扇区的保护状态,必须退出ID ASO并使用
新SA。
支持在非02h的ID位置之间读取页面模式。
这不是(我的组后面两个空格)

ID-CFI位置02h显示ID-CFI输入中使用的扇区地址(SA)所选扇区的扇区保护状态
指挥部。要读取多个扇区的保护状态,必须退出ID ASO并使用
新SA。支持在非02h的ID位置之间读取页面模式。
任何帮助都将不胜感激!
谢谢。

首先,如果您只想找到一个带有验证字符串规则的
,则无需在模式中描述完整字符串

模式的问题在于,负先行检查可以检查方括号分隔的子字符串之外的字符,为了避免问题,需要使用不包括右方括号的负字符类更改点:

<\[SG (?![^\]]*([^\]])[^\]]*\1)[msbrelft]+\]>

你也可以这样写:

<\[SG (?:([msbrelft])(?![^\]]*?\1))+\]>

[\S\S]*
替换
(.|\n)*
似乎有效。
\S:任何不是空白的内容
\s:空格、制表符、换行符

^[\S\s]*<\[SG (?!\w*(\w)\w*\1)[beflmrst]+\]>[\S\s]*$
无论如何,从另一个答案中,我注意到您实际上只想搜索SG标记,而不是获取包含标记的整个文本

因此,最终,这将实现:

<\[SG (?!\w*(\w)\w*\1)[beflmrst]+\]>


是否正在查找有效的
子字符串?比如?使用正则表达式的最好方法是得到正则表达式的结果。然后对正则表达式结果使用Distinct方法。当没有重复项时,正则表达式结果和不同的结果将匹配。无需在C#中使用
[\s\s]
,您可以传递
RegexOptions。单行
标志将匹配正则表达式构造函数和
任何字符<代码>*
就足够了。@WiktorStribiżew谢谢你的提示:)谢谢你,先生!完美的是我昨天来的,非常感谢。
<\[SG (?![^\]]*([^\]])[^\]]*\1)[msbrelft]+\]>
<\[SG (?:([msbrelft])(?![^\]]*?\1))+\]>
^[\S\s]*<\[SG (?!\w*(\w)\w*\1)[beflmrst]+\]>[\S\s]*$
^.*<\[SG (?!\w*(\w)\w*\1)[beflmrst]+\]>.*$
<\[SG (?!\w*(\w)\w*\1)[beflmrst]+\]>