让
exp = ^ [0-9!@#$%^& *()_ + - = [] {};':“\ |,。<> /?\ s] * $
是一个正则表达式,允许我查找包含或不包含特殊字符的所有数字序列。
使用exp
我设法提取大于 5 的所有数字序列。但无法提取 98200 的数字。我没有使用任何限制数字序列应该多长时间。
源代码:
#include <boost/regex.hpp>
#include iostream;
using namespace std;
int main()
{
string s = "16000";
string exp = ^[0-9!@#$%^&*()_+-=[]{};':"\\|,.<>\\/?\\s]*$
const boost::regex e(exp);
bool isSequence = boost::regex_match(s,e);
//isSequence is boolean and should be equal to 1
cout << isSequence << endl;
return 0;
}
答案 0 :(得分:1)
不分青红皂白地逃避一切对我有用.. :)
string exp = "^[0-9\\!@#\\$\\%\\^&*\\(\\)_\\+\\-=\\[\\]\\{\\};\\\':\\\"\\\\|,\\.<>\\/?\\s]*$";
请注意双反斜杠......我相信你可以锻炼你的列表中的哪些字符意味着什么特别的东西,只能逃避那些,因为我没有时间查找在这种情况下具有特殊意义的东西,我逃脱了一切,这对于我测试的一些案例来说效果很好
16000 =&gt;返回1 16A000 =&gt;返回0 16 @ 000 =&gt;返回1
我猜是你想要的......
答案 1 :(得分:1)
我已将括号移到字符类的前面,然后使用以下代码获取98200的输出1:
#include <string>
#include <boost/regex.hpp>
#include <iostream>
using namespace std;
int main()
{
std::cout << "main()\n";
string s = "98200";
string exp = "^[][0-9!@#$%^&*()_+-={};':\"\\|,.<>\\/?\\s]*$";
const boost::regex e(exp);
bool isSequence = boost::regex_match(s,e);
//isSequence is boolean and should be equal to 1
cout << isSequence << endl;
return 0;
}
/**
Local Variables:
compile-command: "g++ -g test.cc -o test.exe -lboost_regex-mt; ./test.exe"
End:
*/
编辑:注意,我使用了常规emacs的经验
表达式。 emacs的信息页面解释说:“要在{。}中加入]
字符集,你必须使它成为第一个字符。“我试过这个
与boost::regexp
一起工作。后来我有更多时间阅读
在增强手册中
http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html#boost_regex.syntax.perl_syntax.character_sets
这没有为perl正则表达式语法指定。
perl语法是boost::regex
的标准设置。根据
规范评论
https://stackoverflow.com/users/2872922/ron-rosenfeld是最好的
回答。
在下面的程序中,我消除了偶然编码到正则表达式中的字符范围。
测试显示字符集开头的括号包含在字符集中。事实证明,即使boost::regex
的官方手册中未指明,我的陈述也是正确的。
尽管如此,我建议https://stackoverflow.com/users/2872922/ron-rosenfeld将他的评论作为答案插入,并将其标记为解决方案。这将有助于其他人阅读这个帖子。
#include <string>
#include <boost/regex.hpp>
#include <iostream>
using namespace std;
int main()
{
std::cout << "main()\n";
string s = "98-[2]00";
string exp = "^[][0-9!@#$%^&*()_+={};':\"|,.<>/?\\s-]*$";
const boost::regex e(exp);
bool isSequence = boost::regex_match(s,e);
//isSequence is boolean and should be equal to 1
cout << isSequence << endl;
return 0;
}
/**
Local Variables:
compile-command: "g++ -g test.cc -o test.exe -lboost_regex-mt; ./test.exe"
End:
*/
我问http://lists.boost.org/boost-users/2013/12/80707.php
John Maddock(boost::regex
库的作者)的答案是:
>I discovered that if one uses an closing bracket as the first character of
>a
>character class the character class includes this bracket.
>This works with the standard setting of boost::regex (i.e., perl-regular
>expressions) but it is not documented in the
>manual page
>
>http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/syntax/
>perl_syntax.html#boost_regex.syntax.perl_syntax.character_sets
>
>Is this an undocumented feature, a bug or did I misinterpret something in
>the manual?
It's a feature, both Perl and POSIX extended regular expression behave the
same way.
John.
答案 2 :(得分:1)
在C#中,你需要逃避]。当它们在字符类中时,您不需要转义[{}()。此外,如果要将短划线包含在字符类中作为包含字符,则它应位于列表的开头或结尾。您所拥有的序列+ - =转换为[+, - 。/ 0123456789:;&lt; =],这使您的正则表达式变得多余。最后,由于终端量词,您允许匹配零长度字符串。这可能是你想要的,但如果没有,请考虑'+'量词。
简单地说
[^A-Za-z]+
在开头/结尾有或没有^ $锚点