正则表达式以不同的顺序查找具有相同数字的数字

Gaz*_*Gaz 3 regex

我一直在寻找一个正常的表达与谷歌一个小时左右现在似乎无法工作这一个:(

如果我有一个号码,请说:

2345

我想找到任何其他数字相同的数字,但顺序不同,如下所示:

2345

例如,我匹配

32455432(相同数字但不同的顺序)

我该怎么写这个正则表达式?

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之外,这几乎适用于任何正则表达式.

  • 这似乎总体上更快:^(?=.*2)(?=.*3)(?=.*4)(?=.*5)[2345] {4} $.我的意思是,当它匹配时,它与你的性能大致相同.但是当你测试一些不匹配的东西时,前瞻方法要快得多,因为它知道在第一个先行失败时就退出. (2认同)

geo*_*wa4 8

我不认为正则表达式是合适的.所以这是一个比这种情况的正则表达式更快的想法:

  • 检查字符串长度,如果它们不同,则返回false
  • 从字符(在你的情况下的数字)到整数进行计数的哈希
  • 循环遍历第一个字符串的字符:
    • 递增该字符的计数器:hash [character] ++
  • 循环遍历第二个字符串的字符:
    • 减少该字符的计数器:hash [character] -
    • 如果任何计数为负(或不存在)则中断
  • 循环访问条目,确保每个条目为0:
    • 如果all都为0,则返回true
    • 否则返回false

编辑: 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)

这也适用于比较字母或其他字符序列,如"上帝"和"狗".