1

我需要使用正则表达式来过滤一个字符串,该字符串将包含至少一个点,并被一个有限的字符集包围,

所以我使用(忽略所有空格):

^[a-z0-9:_-]+ \. [a-z0-9:_-]+$

问题是我需要两次使用完全相同的正则表达式[a-z0-9:_-]+。有没有办法写出更好的?

4

5 回答 5

2

我不知道 lua 是否支持这种语法,(它适用于 perl,所以可能适用于 PCRE):

^([a-z0-9:_-]+)\.(?1)$

(?1)与用于捕获组 1 的模式相同(即 [a-z0-9:_-]+)。

于 2013-09-16T09:28:38.377 回答
2

不,您必须在定点前后显式重复字符集正则表达式。

于 2013-09-16T02:40:53.553 回答
2

如果大小写无关紧要,根据您使用的语言,您可能会逃脱

^[\w:-]+ \. [\w:-]+$

\w火柴[A-Za-z0-9_]


另一种方法是从字符串构建 RegExp。这是一个 JavaScript 示例

var chars = '[\\w:-]';
var re    = new RegExp('^' + chars + ' \\. ' + chars + '$');

re;
// => /^[\w:-] \. [\w:-]$/ 

这个人为的例子并没有为您节省太多,但是根据您的正则表达式的复杂程度,这可以使您不必复制您的字符类。\\另外,在使用字符串构建正则表达式时,不要忘记转义斜杠。


如果我正在编写解析器或其他东西,我可能会将上述示例更进一步,并执行以下操作:

RegExp.build = function(regexen, flags) {
  return new RegExp(regexen.map(function(re) { return re.source }).join(''), flags);
};

var chars = /[\w:-]+/;

RegExp.build([/^/, chars, / \. /, chars, /$/], 'gi');

//=> /^[\w:-]+ \. [\w:-]+$/gi
于 2013-09-16T02:42:23.183 回答
0

一些语言允许将正则表达式存储在变量中,或者从字符串构建它们。例如,在 Perl 中,您可以执行以下操作:

my $re_l = qr/[a-z0-9:_-]+/;
my $re   = qr/^$re_l\.$re_l$/;
于 2013-09-16T02:45:42.270 回答
0

POSITIVE LOOKAHEAD
/^(?=.*[^.]\.[^.])[a-z0-9:_.-]+$/- 至少一个点被非点字符包围
/^(?=^([^.]+\.)+[^.]+$)[a-z0-9:_.-]+$/- 至少一个点并且每个点都被非点字符包围

于 2013-09-16T02:59:16.143 回答