排除组中的字符(正则表达式)

Excluding characters in group (regular expressions)

本文关键字:正则表达式 字符 排除      更新时间:2023-09-26

我对Javascript中的正则表达式有一个问题(我不是正则表达式问题的专业人士)。

由于我没有解释的原因,我必须以某种方式匹配文本,并且我不能更改处理结果的代码。

例如,我想匹配这个文本:Mon.2014/01/01以一种方式获得这个结果:["Mon.","20140101"]这只需要一个正则表达式,没有后处理。

我试着向前看,不包括组,注意到没有向后看和环顾,我没有设法解决它。

编辑:我放了一个代码样本,所以更容易理解我在做什么。

function match(regexes, text) {
    for(var i in regexes) {
        var match = text.match(regexes[i]);
        if(match !== null) {
             return match;    
        }
    }
}
// expected result of match(regexes, "Mon.2014/01/01"): ["Mon.","20140101"]

我告诉过你,我不能改变代码,所以这只能用正则表达式来完成。有人能给点提示吗?非常感谢!

短答:你不能。

如果代码使用String。方法,它只返回与您的regexp匹配的字符串部分。你不能在match regexp中嵌入字符串修改,因为你必须做一个替换。

两个可能的解决方案来解决你的问题:

  1. 在运行此特定代码之前注入一些javascript,并覆盖String.prototype.match方法,将您的regexp文本拆分为2个单独的regexp,一个执行.replace,另一个执行.match——通过这种方式,您可以在数据库中添加支持,以便能够在匹配之前更改字符串。如果没有找到分隔符,则默认为原始匹配方法。

  2. 为修改字符串的需求找到一个替代方案。而不是期待["Mon.","20140101"],期待["Mon.","2014/01/01"]…因为这就是它的存在。现在,如果您需要一个regexp来匹配任何一种格式,这当然是可能的,但它将始终返回它匹配的实际内容。

您可以这样做:

var s = "Mon.2014/01/01";
var result = s.replace(/'//g,'').match(/((?:Mon|Tue|Wed|Thu|Fri)'.)('d{8})/).slice(1);
// result => ["Mon.", "20140101"]

您的"更改代码"标准非常令人困惑。你在一个网站上的代码帮助。但这听起来就像"没有代码我怎么写X ?"

帮助我们更好地了解你在这里的情况。是因为要使用的正则表达式来自数据库吗?您只能修改数据库的内容吗?或者是一个"正则表达式"web服务?这似乎让我们很多人感到困惑,所以请添加一些背景,以便我们可以帮助您解决这个问题。