正则表达式仅匹配前面有空格的特定字符或不匹配任何字符(行首)


Regex to only match specific characters preceded by a space or nothing (start of line)

考虑以下推文:

RT @username This is my tweet
Check this! RT @username This is my tweet
I have PART 2 downloaded

preg_replace()调用中,我正在使用正则表达式将RT(常见的转发语法(替换为{RT}。它几乎有效,但是,它也与上一条推文中PART RT匹配:

  • I have PART 2 downloaded变得I have PA{RT} 2 downloaded

我希望正则表达式只允许在RT前面不允许任何内容(字符串开头(或空格(U+0020(。

当前preg_replace()调用:

echo preg_replace("('RT(?='s)/", '{RT}', $tweet);

正则表达式中RT之前添加(^|[ ])以匹配字符串空格的开头。在方括号之间添加更多字符以包括它们(例如 (^|[ _])也匹配下划线。

解释

  • ^匹配字符串的开头
  • [ ]匹配空格 (U+0020(([] 之间的任何其他字符(
  • ( & )组成一个组
  • | () 表示

所以。。。

  • (^|[ ]) 表示字符串开头空格的(U+0020(

新正则表达式

echo preg_replace("/(^|[ ])('RT(?='s))/", '$1{RT}', $tweet);

注意:@DVK提到,只匹配字符串开头和空格(而不是单词边界(是一种不好的做法。由于 OP 请求了特定字符,因此按字边界匹配在技术上不正确。然而,正如@DVK确实提出了一个有效的观点,我想提一下,在许多情况下使用('b)而不是(^|[ ])将提供更适合你"正确"想法的结果(例如"太棒了,RT 一些推文。尽管如此,请记住,此注释是在被接受后添加的,绝不是此特定问题的答案的一部分 - 它只是为了帮助那些可能遇到类似但不同问题的答案的人。

使用 'b 进行单词边界匹配。 'bRT'b

已编辑:^''s*RT

将匹配任何以 RT 开头的字符串或 RT 等空格

我认为检查 RT 的最佳方法是检查 RT(空格(@username的正则表达式。这意味着你会有类似的东西

#RT's@([a-zA-Z0-9_]+)#

当然,您需要根据用户名中允许的字符更改 [a-zA-Z0-9_]+。考虑到这是一条推文,推特允许字母、数字和下划线,所以这个正则表达式应该可以正常工作。