我想写一个正则表达式来检查单词的字符串,然后是?,:,!
,但我尝试了很多东西,似乎没有什么工作正常......
我想出的最好的是:\\b([a-zA-Z]*)([\:]|[\?])\
测试用语?是这样的:像这样!测试是否一切?作品。
我正在编写一个函数,它来自上面的例句,结果如下:
array(
[0] => phrase,
[1] => array(
[0] => something,
[1] => like this,
[2] => everything
)
答案 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+)[?!:]
如果您只想确保?!:
之一后跟一个单词。不需要前瞻,检查单词边界或其他东西(永远记住:保持简单和愚蠢!)。
正则表达式只返回单个单词,如果单词有?在它后面,当有一个带有':'的单词时会返回几个单词?如果有一个带有':'的单词,我想要将该单词和后续单词拼接到下一个单词!
这是完全可能的:
(\w+)\?|(\w+):\s?(.+?)!
再次:保持简单和愚蠢,但请注意,如果:?!
块内有嵌套:abc!
,会失败!
例如,句子i: will? fail!
不会为您提供单will
,它会为您提供i
和will? 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