我花了最后4个小时试图找出如何编写一些正则表达式,但每次当我认为我得到它时,我的测试失败了...... 任何人都可以帮助我或给我一些线索让我走上正轨吗?我面前有一张备忘单。
我想要以下内容:一个正则表达式,它为每个单词提供了一个字符串?
。
示例:this is a? example sentence? to test the regex?
我希望a
,sentence
和regex
作为结果。
我提出的最好的正则表达式是/\w\?/
。
答案 0 :(得分:4)
只考虑完全由ASCII字母组成的单词的天真正则表达式可以是
\b[A-Za-z]+(?=\?)
\b
word boundary anchor确保整个单词匹配,并且(?=\?)
lookahead assertion断言紧接着之后有一个问号,而没有提出这个问题标记比赛的一部分。
答案 1 :(得分:2)
我想说的是,首先,你可以将一个单词定义为\S+
(你没有定义一个单词,所以我只是去那个。改成别的东西,比如一个限制性更强的字符类如果你愿意,可能像\w+
),甚至可能是\b\S+\b
。
由此,您需要检查?
,这可以通过积极的前瞻(?= ... )
来完成。
现在,您可以从(?=\?)
开始,但这会在正则表达式中一次检查一个位置,如果?
位于单词的开头,则不可行。因此,在找到?
:(?=.*\?)
之前,您还需要允许任意数量的字符(甚至0)。
现在,.*
将允许正则表达式跨越单词,这是不理想的,将其替换为\S*
:
\b(?=\S*\?)\S+
实际上你可以删除最后一个\b
,因为一个单词不会超过\S
。
答案 2 :(得分:1)
正则表达式如下
$string = "this is a? example sentence? to test the regex?";
$output_array = array();
preg_match_all("/\b([a-zA-Z]*)\?/", $string, $output_array);
print_r($output_array[1]);
这将返回所有匹配,但最后没有?
。