有趣的容易看起来正则表达式

时间:2014-09-22 21:23:07

标签: regex

我正在重新措辞我的问题,以清除混淆!

如果字符串中包含某些字母,我想匹配我使用字符类:

[ACD]

它完美无缺!

但我想匹配如果字符串有两个或更多次重复或两个单独的字母

例如: [AKL]应匹配:

ABCVL
AAGHF
KKUI
AKL

但上述内容不应与以下内容相符:

ABCD
KHID
LOVE

因为那些只有一次!

这就是我尝试使用的原因:

[ACD]{2,}

但是它不起作用,可能它不是正确的正则表达式..有人可以帮助我解决这个难题吗?

由于

PS:我将在MYSQL上使用它 - 一种不同的方法也欢迎!但我喜欢使用正则表达式来实现更智能和更短的查询!

8 个答案:

答案 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表达式不包括YUVWXZ])),因此找不到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)中未匹配ZABCDEFGHIJKLMNOPQRSTUVWXYZ的原因是因为您正在查找与您的集合匹配的两个或多个字符。 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)

你的问题不是很明确,但这是我的试用模式

\b(\S*[AKL]\S*[AKL]\S*)\b  

Demo

答案 6 :(得分:0)

非常确定这应该适用于任何情况

(?<l>[^AKL\n]*[AKL]+[^AKL\n]*[AKL]+[^AKL\n]*)[\n\r]

将AKL替换为您需要的字母可以非常轻松地动态告诉我您是否需要它

答案 7 :(得分:0)

这是你在找什么?

".*(.*[AKL].*){2,}.*" (without quotes)

如果你的特征中至少有两个被任何东西所包围,那就匹配它。 它是.NET正则表达式,但对于其他任何东西都应该是相同的