boost正则表达式,如何匹配(或搜索)“不包含某个字符串”?

时间:2021-02-24 18:48:19
例如:
字符串1: abcdCHINAaaaa
字符串2: sdesyyyyaaaa
字符串3: abcdzzzzaaaa


我需要的是:字符串中间不包括“CHINA”子串的字符串。
即:对于字符串1,2,3来讲,我需要字符串2,字符串3,但不需要字符串1.

那正则表达式应该怎么写呢?

谢谢!

9 个解决方案

#1


注:不一定恰好是“字符串中间”,我的意思是:字符串中“不包含某个特殊子串”的正则表达式写法。

#2


提醒:正则表达式不是万能的;但有限状态自动机是万能的。
参考《编译原理》中的词法分析和有限状态自动机。

#3


直接搜索CHINA,搜索到,不符合。用不上正则

#4


如果一定要用正则表达式呢?
我的需求其实很简单,难道正则表达式不支持这种类型的搜索?

#5


一个   if (str.find("CHINA") == string::npos) 就能解决的问题,你非要用正则表达式的话。。。
也可以,方法很多,这里例举一中
[\s\S]*CHINA[\s\S]*
和目标字符串进行match匹配,如果匹配失败,则这个字符串是你要的字符串。
如果匹配成功,则这个字符串不是你要的。

#6


引用 5 楼 CharlesSimonyi 的回复:
一个   if (str.find("CHINA") == string::npos) 就能解决的问题,你非要用正则表达式的话。。。
也可以,方法很多,这里例举一中
[\s\S]*CHINA[\s\S]*
和目标字符串进行match匹配,如果匹配失败,则这个字符串是你要的字符串。
如果匹配成功,则这个字符串不是你要的。



在本贴中我的描述和例子,只是一个例子,为的是便于大家理解,事实上我的问题没有这么简单,这里只是抽象出了最简单的需求。所以,我的现实中的问题,绝对比str.find要复杂的多,所以,才想到要用正则表达式。
你给出的方案,在真实情况下不太可行。主要体现在“和目标字符串进行match匹配,如果匹配失败...”,这个是不行的,当然,它满足我举的例子中的需求。

#7


从纯正则表达式的角度,难道没有语法支持否定语义吗?即:匹配不包含某子字符串。

#8


使用零宽度负预测先行断言

^((?!CHINA)[\s\S])+$

这样就反过来了,如果匹配成功,则说明这个字符串中不包含CHINA,正是你要的字符串
如果匹配失败,则说明这个字符串包含CHINA,不是你要的字符串

http://www.cnblogs.com/dongzhiquan/archive/2009/12/12/1994691.html

#9


引用 8 楼 CharlesSimonyi 的回复:
使用零宽度负预测先行断言

^((?!CHINA)[\s\S])+$

这样就反过来了,如果匹配成功,则说明这个字符串中不包含CHINA,正是你要的字符串
如果匹配失败,则说明这个字符串包含CHINA,不是你要的字符串

http://www.cnblogs.com/dongzhiquan/archive/2009/12/12/1994691.html


刚才测试了一下你的代码,好象可行。
如果要求:既不包括CHINA,又不包括JAPAN,那应该怎么写呢?
事实上,我需要的是这种(即:N者都不包括)的情形。

#1


注:不一定恰好是“字符串中间”,我的意思是:字符串中“不包含某个特殊子串”的正则表达式写法。

#2


提醒:正则表达式不是万能的;但有限状态自动机是万能的。
参考《编译原理》中的词法分析和有限状态自动机。

#3


直接搜索CHINA,搜索到,不符合。用不上正则

#4


如果一定要用正则表达式呢?
我的需求其实很简单,难道正则表达式不支持这种类型的搜索?

#5


一个   if (str.find("CHINA") == string::npos) 就能解决的问题,你非要用正则表达式的话。。。
也可以,方法很多,这里例举一中
[\s\S]*CHINA[\s\S]*
和目标字符串进行match匹配,如果匹配失败,则这个字符串是你要的字符串。
如果匹配成功,则这个字符串不是你要的。

#6


引用 5 楼 CharlesSimonyi 的回复:
一个   if (str.find("CHINA") == string::npos) 就能解决的问题,你非要用正则表达式的话。。。
也可以,方法很多,这里例举一中
[\s\S]*CHINA[\s\S]*
和目标字符串进行match匹配,如果匹配失败,则这个字符串是你要的字符串。
如果匹配成功,则这个字符串不是你要的。



在本贴中我的描述和例子,只是一个例子,为的是便于大家理解,事实上我的问题没有这么简单,这里只是抽象出了最简单的需求。所以,我的现实中的问题,绝对比str.find要复杂的多,所以,才想到要用正则表达式。
你给出的方案,在真实情况下不太可行。主要体现在“和目标字符串进行match匹配,如果匹配失败...”,这个是不行的,当然,它满足我举的例子中的需求。

#7


从纯正则表达式的角度,难道没有语法支持否定语义吗?即:匹配不包含某子字符串。

#8


使用零宽度负预测先行断言

^((?!CHINA)[\s\S])+$

这样就反过来了,如果匹配成功,则说明这个字符串中不包含CHINA,正是你要的字符串
如果匹配失败,则说明这个字符串包含CHINA,不是你要的字符串

http://www.cnblogs.com/dongzhiquan/archive/2009/12/12/1994691.html

#9


引用 8 楼 CharlesSimonyi 的回复:
使用零宽度负预测先行断言

^((?!CHINA)[\s\S])+$

这样就反过来了,如果匹配成功,则说明这个字符串中不包含CHINA,正是你要的字符串
如果匹配失败,则说明这个字符串包含CHINA,不是你要的字符串

http://www.cnblogs.com/dongzhiquan/archive/2009/12/12/1994691.html


刚才测试了一下你的代码,好象可行。
如果要求:既不包括CHINA,又不包括JAPAN,那应该怎么写呢?
事实上,我需要的是这种(即:N者都不包括)的情形。