正则表达式用于搜索单词后跟某个集合的任何符号

时间:2014-01-12 12:38:54

标签: php regex

我想写一个正则表达式来检查单词的字符串,然后是?,:,!,但我尝试了很多东西,似乎没有什么工作正常...... 我想出的最好的是:\\b([a-zA-Z]*)([\:]|[\?])\

测试用语?是这样的:像这样!测试是否一切?作品。

我正在编写一个函数,它来自上面的例句,结果如下:

array(
[0] => phrase,
[1] => array(
             [0] => something, 
             [1] => like this,
[2] => everything
)

2 个答案:

答案 0 :(得分:2)

您可以尝试这样做:

\b\w+\b(?=[!:?])

这将为您的测试句产生以下结果:

'phrase', 'something', 'this', 'everything'

您有一个初始字边界(\b),但在查找!:?之前,您没有完成该字词。这些标点符号在给定单词中不匹配。

此外,[!:?]默认只匹配这三个标点符号中的任何一个,因此您不需要或(|)。

如果您希望在这三个标点符号之前匹配每个完整的短语/句子,您可以尝试这样的正则表达式:

\w[\w\s]+?(?=[!:?])

这会给你:

'The test phrase', 'is something', 'like this', 'to test whether everything'

答案 1 :(得分:0)

我会去

(\w+)[?!:]

如果您只想确保?!:之一后跟一个单词。不需要前瞻,检查单词边界或其他东西(永远记住:保持简单和愚蠢!)。

<小时/> 关于您对@275365s answer的评论:

  

正则表达式只返回单个单词,如果单词有?在它后面,当有一个带有':'的单词时会返回几个单词?如果有一个带有':'的单词,我想要将该单词和后续单词拼接到下一个单词!

这是完全可能的:

(\w+)\?|(\w+):\s?(.+?)!

Regular expression visualization

Debuggex Demo
Demo @ regex101

再次:保持简单和愚蠢,但请注意,如果:?!块内有嵌套:abc!会失败! 例如,句子i: will? fail!不会为您提供单will,它会为您提供iwill? fail

说明:

  (\w+)\?   #every word which is followed by a ?
|           #OR
  (\w+)    #every word
  :         #which is followed by a : 
  \s?       #and an optional whitespace
  (.+?)     #every character
  !         #until a ! is encountered