正则表达式:包含由非字母字符包围的字母字符的单词

时间:2014-11-19 12:41:00

标签: regex

我是正则表达式的菜鸟,我需要帮助解决这个问题:

  

查找并删除1或2个字母组的所有组   由非字母字符包围的字符。   您可能会遇到必须被视为任何拉丁字符的拉丁字符   字母字符。使用PHP,PCRE正则表达式。

例如:

删除:
一个
aa 33 a3 3a
aa3 a3a 3aa 33a a33 3a3
aa3a a3aa 33a3 3a33 aa33 33aa a3a3 3a3a 3aa3 a33a
aa3aa 3aa3a a3a3a aa3a3 33a33 a33a3 3a3a3 33a3a a3a33
aa3aa3 a3a3a3 3a3a3a 33a33a

依旧......

在像“aa3aaa”这样的情况下,正则表达式需要匹配aa3部分。

这是我到目前为止所得到的:

(\b\d*?[a-z]{1,2}\d*?\b)|(\b(\d+?[a-z]{1,2}\d+?)+?\b)|(\b([a-z]{1,2}\d+?[a-z]{1,2})+?\b)|(\b(\d+?[a-z]{1,2})+?\b)|(\b([a-z]{1,2}\d+?)+?\b)

img:https://www.debuggex.com/i/gkZ0uhVVhoysmN81.png

Regex at Debuggex

我无法匹敌的话:
3l3l3
l3l3l

此外,我无法将这个词部分匹配:
aa3aaa

任何改善我的正则表达式的帮助将不胜感激!非常感谢你!

1 个答案:

答案 0 :(得分:1)

你没有说出你使用哪种正则表达式,这是使用PCRE的一种方式:

(?<!\p{L})\p{L}{1,2}(?!\p{L})

Demo

这会以这种方式转换您的要求:

  • 包含1个或2个字母字符的组:\p{L}{1,2}
  • 前面没有字母字符:(?<!\p{L})
  • 后面没有字母字符:(?!\p{L})

如果您的风格不支持Unicode属性,则可以使用\p{L}替换[a-zA-Z]