正则表达式,满足一定条件,且不为空,该如何实现?

fsdffggjnd 2015-03-23 01:23:26
现在的需求是这样的,程序模块化了。

别人从外部传入一个正则表达式,我这边的代码收到后,需要用这个正则表达式,来做匹配。

现在的问题是,我要在别人传入的正则表达式的基础上,加入一个限制条件:

匹配出来的结果,不能为空,即,匹配结果的长度,至少是1。


举例:

如果别人传入的正则表达式,是([ab]*)

那么,如果我直接用它来匹配"cbabc",那么,匹配的结果是:起始位置0,长度0,就是一个空串。

但是,因为要加入一个限制条件,不能为空,所以,期望的结果是"bab"。


现在的问题是,如何在别人的正则表达式上,加入一个“匹配结果不为空的”限制条件呢??











...全文
609 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fsdffggjnd 2015-03-24
  • 打赏
  • 举报
回复
移位解决不了问题。 请尝试下面例子,如果移位了,结果就是错误的了。 移位了,就匹配不到33了。

	std::string s("123321");
	std::smatch m;

	std::regex e("([12]*)|(33)");

	while (std::regex_search(s, m, e)) {
		s = m.suffix().str();
	}

引用 12 楼 jiht594 的回复:
引用 10 楼 fsdffggjnd 的回复:
你给的这个例子,和7楼的,是基本上一样的,是有BUG的。 请参考6楼。 [quote=引用 8 楼 jiht594 的回复:] [quote=引用 4 楼 fsdffggjnd 的回复:] 我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。 [quote=引用 2 楼 jiht594 的回复:] 你把"为空的"结果抛弃就就行了
http://blog.csdn.net/pdcxs007/article/details/39966151 你参考一下这个 [/quote][/quote] 所以才叫你参考. 死循环是因为字符串没变, 你自己移动一位不就好了[/quote]
jiht594 2015-03-24
  • 打赏
  • 举报
回复
引用 10 楼 fsdffggjnd 的回复:
你给的这个例子,和7楼的,是基本上一样的,是有BUG的。 请参考6楼。
引用 8 楼 jiht594 的回复:
[quote=引用 4 楼 fsdffggjnd 的回复:] 我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。 [quote=引用 2 楼 jiht594 的回复:] 你把"为空的"结果抛弃就就行了
http://blog.csdn.net/pdcxs007/article/details/39966151 你参考一下这个 [/quote][/quote] 所以才叫你参考. 死循环是因为字符串没变, 你自己移动一位不就好了
fsdffggjnd 2015-03-24
  • 打赏
  • 举报
回复
你给的这个例子,和7楼的,是基本上一样的,是有BUG的。 10楼说错了,应该是请参考9楼。
引用 9 楼 fsdffggjnd 的回复:
这个网站上的例子,其实是有BUG的,也正正就是要解决我的问题的关键所在。 下面的情况,就是一个死循环。 例如:



#include <iostream>
using namespace std;
#include <regex>

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
	std::string s("12321");
	std::smatch m;

 	//下面这个正则表达式,不要说改成"([12]+)"。
	//因为是外部别人传入的,对我来说是未知的。
	//假如别人输入的,就是"([12]*)",我也没有办法。
	//所以,我必须加上一个条件,就是排除“空串”。

	std::regex e("([12]*)");    

	while (std::regex_search(s, m, e)) {
		s = m.suffix().str();
	}
	
	return 0;
}


引用 7 楼 zhao4zhong1 的回复:
http://www.cplusplus.com/reference/regex/regex_search/
fsdffggjnd 2015-03-24
  • 打赏
  • 举报
回复
你给的这个例子,和7楼的,是基本上一样的,是有BUG的。 请参考6楼。
引用 8 楼 jiht594 的回复:
引用 4 楼 fsdffggjnd 的回复:
我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。 [quote=引用 2 楼 jiht594 的回复:] 你把"为空的"结果抛弃就就行了
http://blog.csdn.net/pdcxs007/article/details/39966151 你参考一下这个 [/quote]
fsdffggjnd 2015-03-24
  • 打赏
  • 举报
回复
这个网站上的例子,其实是有BUG的,也正正就是要解决我的问题的关键所在。 下面的情况,就是一个死循环。 例如:



#include <iostream>
using namespace std;
#include <regex>

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
	std::string s("12321");
	std::smatch m;

 	//下面这个正则表达式,不要说改成"([12]+)"。
	//因为是外部别人传入的,对我来说是未知的。
	//假如别人输入的,就是"([12]*)",我也没有办法。
	//所以,我必须加上一个条件,就是排除“空串”。

	std::regex e("([12]*)");    

	while (std::regex_search(s, m, e)) {
		s = m.suffix().str();
	}
	
	return 0;
}


引用 7 楼 zhao4zhong1 的回复:
http://www.cplusplus.com/reference/regex/regex_search/
fsdffggjnd 2015-03-24
  • 打赏
  • 举报
回复
感觉是对了!!我再认真检查下先。
引用 15 楼 jiht594 的回复:
你看一下这种方式能满足你的要求吗?

#include <string>
#include <iostream>
#include <regex>

using namespace std;

int main()
{
// 	regex reg("[ab]*");
// 	std::string s="cbabc";
	regex reg("([12]*)|(33)");
	std::string s="123321";
	sregex_token_iterator ite(s.begin(), s.end(), reg), end;  

	for ( ; ite != end; ++ite)  
	{  
		cout << ite->str() << endl;  
	}  
	cin.get();
	return 0;
}

jiht594 2015-03-24
  • 打赏
  • 举报
回复
引用 14 楼 fsdffggjnd 的回复:
是否能想出好的方法,解决13楼的情况?
引用 12 楼 jiht594 的回复:
所以才叫你参考. 死循环是因为字符串没变, 你自己移动一位不就好了
你看一下这种方式能满足你的要求吗?

#include <string>
#include <iostream>
#include <regex>

using namespace std;

int main()
{
// 	regex reg("[ab]*");
// 	std::string s="cbabc";
	regex reg("([12]*)|(33)");
	std::string s="123321";
	sregex_token_iterator ite(s.begin(), s.end(), reg), end;  

	for ( ; ite != end; ++ite)  
	{  
		cout << ite->str() << endl;  
	}  
	cin.get();
	return 0;
}

fsdffggjnd 2015-03-24
  • 打赏
  • 举报
回复
是否能想出好的方法,解决13楼的情况?
引用 12 楼 jiht594 的回复:
所以才叫你参考. 死循环是因为字符串没变, 你自己移动一位不就好了
jiht594 2015-03-23
  • 打赏
  • 举报
回复
引用 4 楼 fsdffggjnd 的回复:
我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。
引用 2 楼 jiht594 的回复:
你把"为空的"结果抛弃就就行了
http://blog.csdn.net/pdcxs007/article/details/39966151 你参考一下这个
fsdffggjnd 2015-03-23
  • 打赏
  • 举报
回复
大哥,可惜小弟没有那么多时间去搜资料,所以想在这里遇到高手懂的,帮忙一把。
引用 5 楼 zhao4zhong1 的回复:
http://www.cplusplus.com
赵4老师 2015-03-23
  • 打赏
  • 举报
回复
fsdffggjnd 2015-03-23
  • 打赏
  • 举报
回复
我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。
引用 2 楼 jiht594 的回复:
你把"为空的"结果抛弃就就行了
fsdffggjnd 2015-03-23
  • 打赏
  • 举报
回复
首先,正则表达式是别人传入的,对我来说是未知的。 改变别人的正则表达式,是不可能的,因为根本不知道对方会传什么样的式子进来。 第二,我用std::regex_search这个函数,匹配得出的结果,的确是,index==0,length==0,就是匹配到一个空串。
引用 1 楼 ralln 的回复:
[quote=引用 楼主 fsdffggjnd 的回复:] 现在的需求是这样的,程序模块化了。 别人从外部传入一个正则表达式,我这边的代码收到后,需要用这个正则表达式,来做匹配。 现在的问题是,我要在别人传入的正则表达式的基础上,加入一个限制条件: 匹配出来的结果,不能为空,即,匹配结果的长度,至少是1。 举例: 如果别人传入的正则表达式,是([ab]*) 那么,如果我直接用它来匹配"cbabc",那么,匹配的结果是:起始位置0,长度0,就是一个空串。 但是,因为要加入一个限制条件,不能为空,所以,期望的结果是"bab"。 现在的问题是,如何在别人的正则表达式上,加入一个“匹配结果不为空的”限制条件呢??
首先,对于你的结果来说,匹配结果应该是bab,而不会是空,如果用它来匹配不含有ab字母的字符串,它无法找到,而空又是允许的,当然会匹配成功。如果不想出这个情况,把*改成+即可,即:[ab]+[/quote]
jiht594 2015-03-23
  • 打赏
  • 举报
回复
你把"为空的"结果抛弃就就行了
ralln 2015-03-23
  • 打赏
  • 举报
回复
引用 楼主 fsdffggjnd 的回复:
现在的需求是这样的,程序模块化了。 别人从外部传入一个正则表达式,我这边的代码收到后,需要用这个正则表达式,来做匹配。 现在的问题是,我要在别人传入的正则表达式的基础上,加入一个限制条件: 匹配出来的结果,不能为空,即,匹配结果的长度,至少是1。 举例: 如果别人传入的正则表达式,是([ab]*) 那么,如果我直接用它来匹配"cbabc",那么,匹配的结果是:起始位置0,长度0,就是一个空串。 但是,因为要加入一个限制条件,不能为空,所以,期望的结果是"bab"。 现在的问题是,如何在别人的正则表达式上,加入一个“匹配结果不为空的”限制条件呢??
首先,对于你的结果来说,匹配结果应该是bab,而不会是空,如果用它来匹配不含有ab字母的字符串,它无法找到,而空又是允许的,当然会匹配成功。如果不想出这个情况,把*改成+即可,即:[ab]+

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧