【问题标题】:Detecting specific string whether in start, middle or end of a string with Regular Expressions使用正则表达式检测特定字符串是否位于字符串的开头、中间或结尾
【发布时间】:2011-09-20 19:29:16
【问题描述】:

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

我的问题是我想在任何字符串中找到字符串 'ra','ra' 将被替换为 'RA',但问题是我只想替换 'ra' 只要不属于任何其他词,例如:order_ra 替换为 order RA 但 camera 不能替换为 cameRA。

我用[\s|_]ra(?:[\s|_]) 尝试了所有准备,但不起作用,因为正在寻找像 order_ra 或 order ra 这样的东西,最后有一个空格。我想匹配 order ra 或 order_ra 或者它后面是否有空格。谁可以帮我这个事?我不太懂正则表达式。

我需要这个的原因是因为我想在用户交互发送的字符串中动态大写“ra”,但如果属于像 come*ra* 或 *ra*dical。我不知道我是否解释清楚,如果我没有解释清楚,请原谅。

【问题讨论】:

  • 我想你的意思是:(?:\s|_)ra(?:\s|_)
  • 是的,谢谢 Jacob,但无论哪种方式都有相同的结果,至少使用 RegexBuilder 和或使用 php 函数 preg_replace() 进行测试。

标签: regex string search


【解决方案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_] 匹配一个字母(= 一个不是非字母数字字符且不是数字或下划线的字符),所以否定的环视断言使确保搜索字符串周围没有字母(“not a not a (non-alphanumeric or digit or underscore)”)。扭曲但很有必要,因为我们还希望在此处匹配字符串的开头和结尾。

【讨论】:

  • 太棒了!感谢您的解释,将帮助我了解我在做什么,也很好用!
  • 我喜欢这个答案的地方在于,它不仅限制我只检测下划线 (_) 作为分隔符,还限制我检测任何其他字母数字字符。谢谢!
【解决方案2】:

如果我理解您在寻找什么,以下将执行匹配。非捕获组在 (?:...) 的括号中指定。它与 OP 类似,但也包括行首锚点和行尾锚点。

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

【讨论】:

  • 谢谢马克,这项工作完美!与 Tim Pietzcker 的回答一样,感谢两者!
猜你喜欢
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多