2011-09-20 114 views
1

我一直在阅读一些Q &关于正则表达式,但我还没有找到答案我的问题。我将使用ra作为搜索字符串。检测特定的字符串是否在正则表达式的字符串的开始,中间或结尾

我的问题是我想在任何字符串中找到字符串'ra','ra'将被替换为'RA',但事情是我只想替换'ra',只要不是部分例如:order_ra替换为订购RA,但相机不能用cameRA替换。

我试过所有准备好了[\s|_]ra(?:[\s|_]),并且不起作用,因为正在寻找类似order_ra的任何东西,或者在最后使用空格排序ra。我想匹配顺序ra或者order_ra,不管它有没有空白。谁可以帮我这个事?我对正则表达式不太了解。

我需要这个的原因是因为我想利用在用户交互发送但如果属于一个词串“RA”动态就像来到* RA *或* RA * DiCal的。我不知道我是否清楚地解释自己,如果不是,请原谅。

+0

我想你的意思是:'(?:\ S | _)RA(?:\ S | _)' –

+0

好的,谢谢雅各布,但无论哪种方式具有相同的结果,至少测试它与RegexBuilder和或PHP函数preg_replace()。 – raphie

回答

1

通常情况下,您会使用单词边界:\bra\b只能匹配ra,不能在单词内。不幸的是,下划线被视为字母数字字符,因此index_ra不匹配。

因此你需要自己实现这个。假设你的正则表达式dialext支持Unicode和环视断言,可使用

(?<!\p{L})foo(?!\p{L}) 

这符合foo,但不foobarbazfoo

(?<!\p{L}) # Assert that there is no letter before the current position 
foo  # Match foo 
(?!\p{L}) # Assert that there is no letter after the current position 

如果您不能使用Unicode字符类,试试这个:

(?<![^\W\d_])foo(?![^\W\d_]) 

这是一个有点扭曲的逻辑(三胜负!):[^\W\d_]匹配一个字母(=一个不是非字母数字字符而不是数字或下划线的字符),所以负向查找断言确保搜索字符串周围没有字母(“不是非字母数字或数字或下划线)” )。扭曲但必要的,因为我们也想在这里开始和结束字符串匹配。

+0

太棒了!感谢您的解释,将帮助我了解我在做什么,也很棒! – raphie

+0

我喜欢这个答案是,不仅限制我只检测下划线(_)作为分隔符,但任何其他字母数字字符。谢谢! – raphie

1

如果我明白你在找什么,下面将执行匹配。未捕捉组在的父项中指定。它与OP类似,但也包括开始和结束锚点。

(?:^|\s|_)ra(?:$|\s|_) 
+0

谢谢马克,这工作完美!就像Tim Pietzcker的回答一样,感谢两位! – raphie

相关问题