1

你能帮我找到一个接受这些的表达吗:

C1D3
A1Z5R7
H2L7V5X3

但不接受这些:

A1B2A2 //Because the A repeated 2 times
C4F5F3
C2C1
B1B2F6

我正在尝试创建一个表达式以在 C#.Net 中使用它

4

5 回答 5

3

在这种问题中,反向引用是你的朋友。

所以(.).*\1将匹配一个字符,后跟任何匹配的第一个捕获组

于 2013-10-17T15:29:56.993 回答
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
于 2013-10-17T15:40:16.473 回答
0
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";
于 2013-10-17T15:38:52.477 回答
0

你可以在没有正则表达式的情况下做到这一点:

StringReader reader = new StringReader(str);
string line;
while((line = reader.ReadLine()) != null)
{
   if (line.Distinct().Count() != line.Length)
       return false;
}
return true;
于 2013-10-17T15:39:32.080 回答
0

您可以使用这种基于负前瞻的 rgex 来避免匹配包含重复的字符串:

/^(?:(.)(?!.*?\1))+$/

/^(?:(.)(?!.*?\1))+$/.test('A1B2D3');  // true
/^(?:(.)(?!.*?\1))+$/.test('A1B2A3');  // false
于 2013-10-17T15:41:02.277 回答