用于在JavaScript中替换令牌的正则表达式

时间:2014-11-07 20:56:17

标签: javascript regex

我对JavaScript有一个非常具体的要求,我想知道是否有人可以提供帮助。

我正在寻找可以用来验证字符串中的令牌的验证Regex。每个令牌的格式如下:

(__([A-Z1-9_])+__)

IOW,两个下划线,后跟任意数量的大写字母,数字或下划线,以及另外两个下划线结尾。例子可能是:

__A_TOKEN__
__ANOTHER_1T_O_K_E_N__

令牌不能包含两个下划线,因此以下内容无效:

__A__TOKEN__

最后,字符串中可能有多个标记,包含或不包含其他前导或尾随字符,如下所示:

http://__DOMAIN__/__PATH__/logs/__LOGFILE__.log

理论上,甚至可能有两个令牌彼此相邻,例如:

__TOKEN_A____TOKEN_B__

我已经玩了一段时间的正则表达式了,但这让我很难理解如何验证。只需检查具有可选前导/尾随文本的单个令牌就足够了,其中包含:

^(.*)?(__([A-Z1-9_])+__)+(.*)?$

但我如何检查多个令牌,如此(使用上述正则表达式进行验证):

xxx__UPPERCASE__yyy__lowercase __

不应该被允许,因为__lowercase__不是有效的令牌。

这是以程序方式而不是正则表达式进行最佳验证的东西吗?

2 个答案:

答案 0 :(得分:1)

我有一个解决方案:

/__([A-Z\d]+(?:_[A-Z\d]+)*)__/g

是的,那里有重复,但它很容易改变。

您可以在此处查看此链接:http://regex101.com/r/zZ6cC3/1

答案 1 :(得分:1)

这会考虑您使用背后的负面看法提供的规则。

var str = "__TOKEN_A____TOKEN_B__"; 
var res = str.match(/__(?:(?!__)[A-Z1-9_])+__/g);
alert(res);

<强>正则表达式

/__(?:(?!__)[A-Z1-9_])+__/g

<强>解释

__            -- Match the two underscores (the start of a token)
(?:           -- Non-capturing group
 (?!__)       -- Negative look behind to check if we're starting a new token
 [A-Z1-9_]    -- Valid characters within the token
)+            -- Allow one or more valid characters
__            -- The ending token sequence of two underscores