一个正则表达式来查找

时间:2013-08-17 21:15:47

标签: regex

我想要一个不区分大小写的表达式,它会在逻辑上找到: (stringA OR stringB)AND stringC。

因此,如果stringA是“dr”,stringB是“doctor”而stringC是“presume”,我想要这些结果:

Dr. Livinsgston I presume           TRUE
Doctor Livingston I presume         TRUE
Mr. Livingston I presume            FALSE

在测试字符串中的值所在的位置并不重要,但如果我可以让表达式要求(A或B)在测试字符串中的C之前,那就更好了。

这是否适用于正则表达式?

4 个答案:

答案 0 :(得分:1)

上面发布的Python解决方案完成了这项工作;但是,如果您只是想学习如何做这样的事情,那么这里有一个可能的解决方案(在JavaScript中;语法可能因其他语言而异):

/(dr|doctor).*?presume/i.test(...);

最后的i使它不区分大小写(相当于事先将测试的字符串转换为小写)。括号中的单词之间的|使得这两个单词可以互换。 .*?只是意味着括号和presume中的内容之间几乎可以有任何内容。

请注意,这意味着presume必须位于括号内的内容之前。但老实说,如果订单很重要,你会因为正则表达而感到很痛苦。

答案 1 :(得分:1)

在Perl中,你可以做类似的事情。

(?:[Dd]r|Doctor).*(?:presume)

正则表达式:

(?:                        group, but do not capture:
  [Dd]                     any character of: 'D', 'd'
     r                     match 'r'
     |                     OR
     Doctor                match 'Doctor'
)                          end of grouping
 .*                        any character except \n (0 or more times)
  (?:                      group, but do not capture (1 or more times)
    presume                match 'presume'
  )                        end of grouping

断言的简短解释。见Regex lookahead, lookbehind and atomic groups

(?=)    Positive look ahead assertion
(?!)    Negative look ahead assertion
(?<=)   Positive look behind assertion
(?<!)   Negative look behind assertion
(?>)    Once-only subpatterns 
(?(x))  Conditional subpatterns
(?#)    Comment (?# Pattern does x y or z)

答案 2 :(得分:0)

非常可靠的正则表达式,但在这种情况下绝对没有理由使用正则表达式。你没有添加语言,所以这是python中的简单解决方案:

def check_string(test_string):
    lowered_string = test_string.lower()
    doctor = lambda s: "dr" in s or "doctor" in s
    presume = lambda s: "presume" in s
    return doctor(lowered_string) and presume(lowered_string)

一般情况下,您希望尽可能避免使用正则表达式,并且只需对字符串的小写版本进行检查就可以轻松地使检查不区分大小写(就像我上面所做的那样。)

如果你想将它与正则表达式匹配,这里是一个版本的d'alar'cop的答案实际上有效(转移到python以保持我的答案内部一致):

import re
return bool(re.match( r'(dr|doctor).*?presume',test_string.lower()))

答案 3 :(得分:0)

是的,您可以使用正则表达式执行此操作。使用grep,您可以简单地执行此操作

echo Doctor Livinsgston I presume | grep "^\(Dr\.\|Doctor\).*presume$" >/dev/null; [[ $? == 0 ]] && echo TRUE || echo FALSE
TRUE
echo Dr. Livinsgston I presume | grep "^\(Dr\.\|Doctor\).*presume$" >/dev/null; [[ $? == 0 ]] && echo TRUE || echo FALSE
TRUE
echo Mr. Livinsgston I presume | grep "^\(Dr\.\|Doctor\).*presume$" >/dev/null; [[ $? == 0 ]] && echo TRUE || echo FALSE
FALSE