下面给出了字符串,我想从中提取文本。
字符串:
Hello Mr John and Hello Ms Rita
正则表达式
Hello(.*?)Rita
我尝试在2个字符串之间获取文本" Hello"和"丽塔"我正在使用上面给出的正则表达式,但它正在给我
Mr John and Hello Ms
这是错误的。我只需要" Ms"任何人都可以帮助我为这种情况写出正确的正则表达式吗?
答案 0 :(得分:2)
Hello((?:(?!Hello|Rita).)*)Rita
^^^^^^^^^^^^^^^^^^^
(?:(?!Hello|Rita).)*
是驯化的贪婪令牌,仅匹配非Hello
或Rita
的文字。如果您需要检查整个单词,可以添加单词边界\b
。
为了获得两端没有空格的Ms
,请使用此regex variation:
Hello\s*((?:(?!Hello|Rita).)*?)\s*Rita
将?
添加到*
将形成一个惰性量词*?
,它匹配查找匹配所需的少量字符,而\s*
将匹配零个或多个空格
答案 1 :(得分:1)
要获得与结束字最接近的匹配,请让初始字前面的greedy点消耗。
.*Hello(.*?)Rita
或者没有捕获的空格:.*Hello\s*(.*?)\s*Rita
或者使用两个捕获组:.*(Hello\s*(.*?)\s*Rita)
答案 2 :(得分:0)
由于(.*?)
匹配任何字符串,因此.*
文字过多。因此它最终抓住了从第一个“Hello”到“Rita”的所有内容。
通过这个正则表达式可以轻松获得所需内容:
Hello (\S+) Rita
\S
匹配任何非空白字符,因此\S+
匹配任何连续的非空白字符串,即单个字。
这将更加健壮,允许在单词之间存在多个空格或其他空格:
Hello\s+(\S+)\s+Rita
答案 3 :(得分:0)
你可以使用lookahead和lookbehind (?<=Hello).*?(?=Rita)