2017-08-17 34 views
-2

我有字符串biz'bazbiz可以是任何东西,所以像bla'baz就可以;但是如果字符串变为bizbaz,我希望它返回bizbaz,如果baz'开始,则返回任何内容。我怎么能用这个逻辑做些事情?我需要一个预见吗?之后它可能会有更多的字符。如何检查一个单词是否前面有一个字符?

biz'baz将返回不匹配。

bizbaz会返回一个匹配(bizbaz)。

bizbiz'baz将返回不匹配。

hellohi'bazhello将返回不匹配。

+0

你尝试过什么吗? – anubhava

+0

是的,但我的尝试完全脱离了语境,所以我认为发布我尝试过的东西并不是很有用。 – WayneXMayersX

+0

你使用的是什么正则表达式?你能否给出一个预期的输入/输出清晰的例子? –

回答

0

尝试:

\Bbaz 

\B的意思是 “不是一个单词边界”。

单词边界是指您有字母数字字符[A-Za-z0-9]或下划线(由于历史原因计为一个字母)和一个字母,它不是任何这些东西,彼此相邻。

因此: biz'baz - 不匹配:在b旁边有一个“字边界”。

bizbaz - match:b没有字边界。

bizbiz'baz - 不匹配:b旁边有一个“字边界”。

hellohi'bazhello - 不匹配:b旁边有一个“字边界”。

biz @ baz - 不匹配:b旁边有一个“单词边界”。

biz_baz - 匹配:b旁边没有“单词边界”,因为下划线是一个字母,因为愚蠢的原因。

如果下划线的问题,那么你就可以明确地列出你算字的字符,像这样的人物:

[a-zA-Z0-9]+baz 

,其行为是相同的,除了两件事情。

1)它不会将下划线视为字母。

2)匹配时,它匹配整个单词,而不仅仅是“baz”部分。

+0

为什么我不能匹配'biz @ baz'或者'biz baz'? – WayneXMayersX

+0

我不明白这个问题。你已经问过前面的字符是单词字符。 @不是一个字的字符。 –

+0

更新了我的回答以澄清。 –

1

使用先行是一个很好的解决方案。

您可以使用:

/(?!^\p{L}*'\p{L}*(?:\s|$))(^\p{L}+)/ 

demo

在这种情况下,你需要使用某种形式的有关的锚为先行有道理。您可以使用^作为该行的开头,但需要一些锚点或'之后的单词字符进行匹配。

相关问题