我一直在寻找一个正常的表达与谷歌一个小时左右现在似乎无法工作这一个:(
如果我有一个号码,请说:
2345
我想找到任何其他数字相同的数字,但顺序不同,如下所示:
2345
例如,我匹配
3245或5432(相同数字但不同的顺序)
我该怎么写这个正则表达式?
Tim*_*ker 17
使用单个正则表达式可以实现"优雅"的方式:
^(?:2()|3()|4()|5()){4}\1\2\3\4$
Run Code Online (Sandbox Code Playgroud)
将以任何顺序匹配数字2,3,4和5.这四个都是必需的.
说明:
(?:2()|3()|4()|5())匹配数字2,3,4或5中的一个.现在的技巧是捕获括号在匹配数字(总是成功)后匹配空字符串.
{4} 要求这发生四次.
\1\2\3\4然后要求所有四个反向引用都参与了比赛 - 当且仅当每个数字出现一次时,他们才会这样做.由于\1\2\3\4匹配一个空字符串,只要前一个条件为真,它就会始终匹配.
对于五位数,您需要
^(?:2()|3()|4()|5()|6()){5}\1\2\3\4\5$
Run Code Online (Sandbox Code Playgroud)
等等...
除了JavaScript之外,这几乎适用于任何正则表达式.
我不认为正则表达式是合适的.所以这是一个比这种情况的正则表达式更快的想法:
编辑: Java代码(我在这个例子中使用了Character,不完全是Unicode友好的,但它现在很重要):
import java.util.*;
public class Test
{
public boolean isSimilar(String first, String second)
{
if(first.length() != second.length())
return false;
HashMap<Character, Integer> hash = new HashMap<Character, Integer>();
for(char c : first.toCharArray())
{
if(hash.get(c) != null)
{
int count = hash.get(c);
count++;
hash.put(c, count);
}
else
{
hash.put(c, 1);
}
}
for(char c : second.toCharArray())
{
if(hash.get(c) != null)
{
int count = hash.get(c);
count--;
if(count < 0)
return false;
hash.put(c, count);
}
else
{
return false;
}
}
for(Integer i : hash.values())
{
if(i.intValue()!=0)
return false;
}
return true;
}
public static void main(String ... args)
{
//tested to print false
System.out.println(new Test().isSimilar("23445", "5432"));
//tested to print true
System.out.println(new Test().isSimilar("2345", "5432"));
}
}
Run Code Online (Sandbox Code Playgroud)
这也适用于比较字母或其他字符序列,如"上帝"和"狗".