正则表达式以任何顺序匹配字符串

问题描述:

如何在java中使用正则表达式模式在洗牌顺序中找到字符串abc的第一个匹配项?正则表达式以任何顺序匹配字符串

实施例:

输入1:abcbaa
输入2:bcbaaa
输入3:cbaaab

为输入1第一匹配:ABC输入2 BAAB
第一匹配:乙cba aab
输入3的第一个匹配:bca aabc

模式,我试过,没有工作:

(?:([abc])(?!\\.*]\\1)){3} 
(?!(.)\\1)[abc]{3} 

上述2个模式匹配连续3个字符,包括重复值。
例如:ABA BAC
预期:ABA BAC

(?=.*[abc])(?=.*[abc])(?=.*[abc]) 

这一个比赛和空字在-之间的每个字符。即字符串位置(0,0),(1,1),(2,2)等...

+0

请显示一些代码。你试过什么了? SO不会构建解决方案,而是回答具体问题。 –

+0

阅读一些关于正则表达式的教程,你会发现你需要什么。 – Ephi

+0

[Java Regex以任意顺序查看单词组合]的可能副本(http://*.com/questions/26041258/java-regex-looking-a-combination-of-words-in-any-order) –

你试过看所有的可能性吗?像这样与你的例子:

(abc|acb|bca|bac|cab|cba) 
+0

这个解决方案事件如果很简单,并不能真正给你带来最好的性能(factorial(n)复杂度) –

也许你应该试试这个正则表达式:

^(?=[\s\S]*(a)+)(?=[\s\S]*(b)+)(?=[\s\S]*(c)+)[\s\S]*$ 
+1

'(。| \ s)*'是[非常低效率](http://*.com/questions/ 2407870/javascript-regex-hangs-using-v8)并且不应该被使用。相反,使用Java的'DOTALL'标志,或者在正则表达式的开头添加'(?s)'。 –

+0

谢谢你,艾伦。 我可以使用[^] *而不是(。| \ s)*吗? –

+0

'[^]'仅在JavaScript风格中有用,它没有DOTALL选项(尚)。在Java中它是一个语法错误。如果您使用的是JavaScript,我建议您改用'[\ s \ S]'。它的时间更长,但它在各种风格中的作用相同,其含义更明显(任何空格字符+任何非空白字符=任何字符)。 –

(?:a()|b()|c()){3}\1\2\3 

空组像复选框,所以如果\1\2\3比赛,每个字母都必须有至少见过一次。由于正则表达式只消耗三个字符,你知道每个字母只有一个字母。