使用正则表达式检测字符串的开头,中间或末尾的特定字符串

时间:2011-09-20 19:29:16

标签: regex string search

我一直在阅读关于正则表达式的一些Q& A但我没有找到回答我的问题。我将使用ra作为搜索字符串。

我的问题是,我想在任何字符串中找到字符串'ra','ra'将替换为'RA',但问题是我只想替换'ra',因为很长时间不是任何其他单词,例如:order_ra替换为订单RA但摄像机不能替换为cameRA。

我尝试了所有准备好的[\s|_]ra(?:[\s|_])并且无法正常工作,因为正在查找order_ra之类的内容或订购ra,并在末尾添加空格。我想匹配订单ra或order_ra,或者它之后是否有空格。谁可以帮我这个事?我对正则表达不太懂。

我需要这个的原因是因为我想在用户交互发送的字符串中动态地大写'ra',但是如果属于像* * em> ra *或* < EM> RA * DiCal的。我不知道我是否清楚地解释了自己,请原谅我,如果我不是。

2 个答案:

答案 0 :(得分: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_]匹配一个字母(=一个不是非字母数字字符而不是数字或下划线的字符),所以负面的看法断言确保搜索字符串周围没有字母(“不是a(非字母数字或数字或下划线)”)。扭曲但必要,因为我们也想在这里开始和结束字符串匹配。

答案 1 :(得分:1)

如果我理解您要查找的内容,以下内容将执行匹配。非捕获组在(?:...)的parens中指定。它类似于OP,但也包括起始和终止锚点。

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