正则表达式匹配除特定字符

时间:2015-11-30 03:12:15

标签: regex

我正在尝试设置一个与以下内容匹配的正则表达式:

*test*
*t*
*te*

但是,我不希望它匹配:

*test**

一般规则是:

  • 必须以行首(^)或空白字符(\s
  • 开头
  • 必须只有一个*
  • 可以匹配任何角色
  • 必须再匹配一个*
  • 必须以行尾($)或空白字符(\s)结束

我已经生成了以下正则表达式:

(\s|^)\*([^\*].+?[^\*])\*(\s|$)

这几乎满足了我的要求;但是,由于第二个捕获组中的两个[^\*]组,似乎要求捕获组为3个字符或更多。 *tes*匹配,但*t**te*不匹配。

我有三个具体问题:

  1. 为什么字符否定会导致3个字符的限制?
  2. 是否有更好的方式表达"除了"比我在这里做的更多?
  3. 有关更好的正则表达式以满足我的要求的任何想法吗?

1 个答案:

答案 0 :(得分:4)

正则表达式中的问题是捕获组中的额外.

[^\*].+?[^\*]
     ^

这将匹配除*之外的字符,后跟一个或多个除换行符之外的任何字符。

由于字符类重复两次,您可以使用+量词来匹配一个或多个字符。

(\s|^)\*([^\*]+?)\*(\s|$)

Demo

您还可以使用非捕获组来排除额外匹配。

(?:\s|^)\*([^\*]+?)\*(?:\s|$)

Demo 2