你能帮我找到一个接受这些的表达吗:
C1D3
A1Z5R7
H2L7V5X3
但不接受这些:
A1B2A2 //Because the A repeated 2 times
C4F5F3
C2C1
B1B2F6
我正在尝试创建一个表达式以在 C#.Net 中使用它
在这种问题中,反向引用是你的朋友。
所以(.).*\1
将匹配一个字符,后跟任何匹配的第一个捕获组
假设你有一堆大写字母/数字对......
/^(([A-Z])(?!.*\2)[0-9])+$/g
/^ # Start regex, and pattern match
( # Start group 1
([A-Z]) # Capture any character from A-Z into group 2
(?!.*\2) # Do negative lookahead `(?!...)` to ensure there is no repeat of the captured group 2 (`\2`), after zero or more of anything (`.*`)
[0-9] # Capture a digit
)+ # End group 1
$/g # End regex, and pattern match, with global flag set
/^(([A-Z0-9])(?!.*\2))+$/g
string pattern=@"\w+";
var uniqueCharWords=Regex.Matches(input,pattern)
.Cast<Match>()
.Where(x=>x.Value.Distinct()==x.Value.Length);
如果您正在寻找完美的正则表达式,就是这样
string pattern=@"\b(?!\w*(\w)\w*\1\w*)\w+\b";
你可以在没有正则表达式的情况下做到这一点:
StringReader reader = new StringReader(str);
string line;
while((line = reader.ReadLine()) != null)
{
if (line.Distinct().Count() != line.Length)
return false;
}
return true;
您可以使用这种基于负前瞻的 rgex 来避免匹配包含重复的字符串:
/^(?:(.)(?!.*?\1))+$/
/^(?:(.)(?!.*?\1))+$/.test('A1B2D3'); // true
/^(?:(.)(?!.*?\1))+$/.test('A1B2A3'); // false