Regex C+上的Bug+;11在Ubuntu 14.04(g+;+;/clang)上运行时使用正则表达式,但不在Windows(mingW)中使用
我需要使用C++11正则表达式解析文件(不是Boost,不是外部库,不是调用bash或python例程,等等) 首先,我需要丢弃不包含任何URL域的行 然后,从这些保留的行中,我需要提取域并将它们返回到容器中 示例:从,我只需要保留:www.xjr.com 因此,我建立了自己的以下正则表达式:Regex C+上的Bug+;11在Ubuntu 14.04(g+;+;/clang)上运行时使用正则表达式,但不在Windows(mingW)中使用,regex,linux,c++11,ubuntu-14.04,Regex,Linux,C++11,Ubuntu 14.04,我需要使用C++11正则表达式解析文件(不是Boost,不是外部库,不是调用bash或python例程,等等) 首先,我需要丢弃不包含任何URL域的行 然后,从这些保留的行中,我需要提取域并将它们返回到容器中 示例:从,我只需要保留:www.xjr.com 因此,我建立了自己的以下正则表达式: std::regex urlRgx("((([[:print:]])?)*(https|http)://(www|ww2|web))\\. ([[:alnum:]]{2,256}.[[:alpha:]]{
std::regex urlRgx("((([[:print:]])?)*(https|http)://(www|ww2|web))\\.
([[:alnum:]]{2,256}.[[:alpha:]]{2,4})((/([[:alnum:]])?)*(([[:print:]])?)*)");
由于不同的原因(以及正则表达式不兼容带来的麻烦),我在Windows 10下(使用MinGW:g++-6.*)以代码块16.01完成了编译和运行程序,没有任何问题
但是,当我来到我想要的环境Ubuntu14.04时,程序编译成功,但在运行时,它只是被卡住了,没有提供任何输出
总是在Ubuntu 14.04中,我尝试:
您能提供一些有用的建议吗?哪些部分带有
(…)?)*
?在我看来,它们可以以无限多的方式匹配空字符串,这听起来不太明智。我认为正则表达式出于某种原因是病态的,这可能是我的第一个怀疑。第一部分和第三部分:(([:print:])?)*:它寻找任何可打印的字符,这些字符可以存在或不存在(?)以及任意数量的字符(*)。请考虑,域可能存在于(或不)在字符串的任何部分中。第二部分:查找字母数字字符,如:“/my_folder/index.html”。因此,没有空字符串。“是否存在任何数量”是星号本身的作用。不需要?。问号:“是否出席”;星号:“以前的任何数量”。所以:如果存在某种东西(“?”)(可打印等),它可以以任何数量(“*”)存在。如果不存在,则为“任何数量的零”。示例1:flasjfña jffjñsa!eqson234%%%mydoimain.org fahfñal)(在这种情况下,由于mydomain.org前后都存在垃圾,因此我需要丢弃垃圾并只保留mydomain.org(同时丢弃子域、文件夹等)例2:urpoeurpqpruqwerupurepq urpouqrpoqurepq r在本例中,我需要拒绝所有行:无域。您缺少“任何金额”包括“零金额”。因此[:print:][]*
完成了您对的所有期望(([:print:])?)*
:它匹配任何非空的可打印字符序列以及空字符串。尝试一下。(…)的部分是什么*
?在我看来,它们可以以无限多的方式匹配空字符串,这听起来不太正常。我认为正则表达式出于某种原因是病态的,这可能是我的第一个怀疑。第一部分和第三部分:([[:print:]]?)*:它查找任何可打印的字符,这些字符可以存在或不存在(?)以及任意数量的(*)请考虑,域可能存在于(或不)字符串的任何部分。第二部分:查找字母数字字符,如:“/My文件夹/ index .html”。因此,没有空字符串。“无论是否存在”都是星号唯一所做的。无需问号:“现在或否”;星号:“以前的任何数量”。因此,如果某个东西存在(“?”)(可打印等),它可以以任何数量(“*”)存在。如果它不存在,那么它就是“任何数量的零”。示例1:flasjfña jffjñsa!eqson234%%%mydoiman.org fahfñal)(/$”kk:在这种情况下,由于mydomain.org前后都存在垃圾,我需要丢弃垃圾并只保留mydomain.org(同时丢弃子域、文件夹等)。示例2:urpoeurpqpruqwerupurepq urpouqrpoqurepq r在这种情况下,我需要拒绝所有行:那里没有域。您缺少“任何金额”包括“零金额”。因此,[[:print:]*
完成了您对(([:print:]])?)*
的所有期望:它匹配任何非空的可打印字符序列以及空字符串。请尝试一下。