我正在重新措辞我的问题,以清除混淆!
如果字符串中包含某些字母,我想匹配我使用字符类:
[ACD]
它完美无缺!
但我想匹配如果字符串有两个或更多次重复或两个单独的字母
例如:
[AKL]
应匹配:
ABCVL
AAGHF
KKUI
AKL
但上述内容不应与以下内容相符:
ABCD
KHID
LOVE
因为那些只有一次!
这就是我尝试使用的原因:
[ACD]{2,}
但是它不起作用,可能它不是正确的正则表达式..有人可以帮助我解决这个难题吗?
由于
PS:我将在MYSQL上使用它 - 一种不同的方法也欢迎!但我喜欢使用正则表达式来实现更智能和更短的查询!
答案 0 :(得分:5)
要确保字符串在一组字母中至少包含两个出现的位置(比如示例中的A K L
),您可以编写如下内容:
[AKL].*[AKL]
由于MySQL正则表达式引擎是DFA,因此不需要使用像[^AKL]
这样的否定字符类代替点来避免回溯,或者根本不需要使用延迟量词。
示例:
SELECT 'KKUI' REGEXP '[AKL].*[AKL]';
将返回1
您可以关注this link讲述LIKE的特定主题和MySQL中的REGEXP功能。
答案 1 :(得分:2)
如果我理解正确,这很简单:
[A-Z].*?[A-Z]
这会在您的集合[A-Z]
中查找您的内容,然后懒惰地匹配字符,直到它(可能)再次遇到集合[A-Z]
。
正如@Enigmadan所指出的,这里不需要进行懒惰匹配:[A-Z].*[A-Z]
答案 2 :(得分:0)
您使用的表达式使用这些字符ACDFGHIJKMNOPQRSTUVWXZ
搜索2到无限次的字符。
但是,您的RegEx表达式不包括Y
(UVWXZ])
),因此找不到Z
,因为它没有被表达式中的其他字符包围,并且同样的原则适用于{{ 1}}(B
)也在您的RegEx表达式中排除。例如,Z和A将匹配[ACD
如果那些不有意排除,可能更好的方法是使用ZABCDEFGHIJKLMNOPQRSTUVWXYZA
等范围
答案 3 :(得分:0)
总体而言,MySQL正则表达式支持相当薄弱。
如果您只需要将捕获组至少匹配两次,那么您只需使用:
select * from ... where ... regexp('([ACD].*){2,}') #could be `2,` or just `2`
如果您 需要 与您的捕获组更多匹配两次,那么只需更改数字:
select * from ... where ... regexp('([ACD].*){3}')
#This number should match the number of matches you need
如果您需要至少7场比赛,并且您使用的是之前的抓取组[ACDF-KM-XZ]
e.g。
select * from ... where ... regexp('([ACDF-KM-XZ].*){7,}')
你的正则表达式试图从集[ACDFGHIJKMNOPQRSTUVWXZ]
中找到至少两个字符。
([ACDFGHIJKMNOPQRSTUVWXZ]){2,}
您的示例字符串(A
)中未匹配Z
和ABCDEFGHIJKLMNOPQRSTUVWXYZ
的原因是因为您正在查找与您的集合匹配的两个或多个字符。 A
是一个单个字符,后跟一个与您的集合不匹配的字符。因此,A不匹配。
同样,Z
是一个单个字符,前面是与您的集合不匹配的字符。因此,Z
不匹配。
下面的粗体字符与您的设置不符 A 乙 CD的电子 FGHIJK的→ MNOPQRSTUVWX的ý以Z
如果要在字符串中进行全局搜索,则只匹配斜体字符:
A 乙的 CD 的电子的 FGHIJK 的→的 MNOPQRSTUVWX 的< b>ÿ以Z
答案 4 :(得分:0)
如果您想要[AKL]
上的两个或更多匹配,那么您可以只使用[AKL]
并且可以match >= 2
。
我不擅长SQL正则表达式,但可能是这样的吗?
check (dbo.RegexMatch( ['ABCVL'], '[AKL]' ) >= 2)
要用简单的英语说明,请使用[AKL]
作为正则表达式,并检查字符串上的匹配项是否大于2.以下是我将如何处理Java:
private boolean search2orMore(String string) {
Matcher matcher = Pattern.compile("[ACD]").matcher(string);
int counter = 0;
while (matcher.find())
{
counter++;
}
return (counter >= 2);
}
您无法使用[ACD]{2,}
,因为它总是希望匹配每个字符中的2个或更多,如果您有2个或更多匹配的单个字符,则会失败。
答案 5 :(得分:0)
答案 6 :(得分:0)
非常确定这应该适用于任何情况
(?<l>[^AKL\n]*[AKL]+[^AKL\n]*[AKL]+[^AKL\n]*)[\n\r]
将AKL替换为您需要的字母可以非常轻松地动态告诉我您是否需要它
答案 7 :(得分:0)
这是你在找什么?
".*(.*[AKL].*){2,}.*" (without quotes)
如果你的特征中至少有两个被任何东西所包围,那就匹配它。 它是.NET正则表达式,但对于其他任何东西都应该是相同的