2013-07-10 29 views
1

我需要一个正则表达式,允许其中没有连字符的单词。 例如,在一个字符串“非单词句子”中,它只能匹配“句子”。 我写道:匹配内部没有连字符的单词

"\b(?!\w+[-]\w+)\w+" 

和失败:

它不仅是 “一句话”,但也 “字” 相匹配。

如何让它忽略带连字符的单词?

+1

您正在使用哪种正则表达式引擎? PCRE?这是针对C++程序的,因为你的标签说明了什么? –

+1

要添加到@ JesseSmith的评论,我很好奇,因为你使用的是哪种引擎,AFAIK,没有C++标准库有工作正则表达式(我可能是错的,在这种情况下,我很乐意被纠正) 。现在C++ 11核心语言的工作已经非常成熟,但标准库已经落后了...... – syam

+0

@syam:C++自C++ 11起支持正则表达式,例如C++ 11。 http://en.cppreference.com/w/cpp/regex –

回答

0

这会为你工作:

(?<=[^\s])[a-zA-Z]*(?=[$\s]) 
+0

这不适用于RegExr。它只是匹配'word' –

+0

@Jesse Smith,我看你是对的,你知道为什么,我认为(?<= [^ \ s])会强制它匹配字符串的开头或空白,所以它应该没有匹配的词。 – Jbad26

+0

[^ \ s]将匹配任何不是空白的。所以一个积极的后视断言是说'是我的现在位置前面是什么而不是空白吗?'这不是我们所要求的。我们问'我的现在位置是不是以连字符开头?' –

3

好吧,这里是一个PCRE(Perl兼容正则表达式系统,这意味着大多数):

(?<![-])\b[a-zA-Z]+\b(?![-]) 

让我打破它对你来说:

(?<![-]):负面后视 - “接下来的事情就是匹配,看看它的前面的事情,如果是连字符,忽略这个匹配”

\b[a-zA-Z]+\b:单词边界,单词,单词边界。我们的'东西'。

(?![-]):负前瞻 -

Here it is在我最喜爱的在线正则表达式测试仪,RegExr“相匹配,看的东西之后,如果这是一个连字符,忽略这场比赛的事情。”

+0

嘿,杰西,后视+东西+前瞻是非常聪明的。很多谢谢! – eger

+0

你能否接受问题是否解决了你的问题?这将有助于未来有同样问题的人。 –

相关问题