编写此正则表达式的更好方法是什么,以确保目标字符串包含至少一个点?

时间:2013-09-16 02:39:25

标签: regex lua lua-patterns

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

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

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

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

5 个答案:

答案 0 :(得分:2)

不,您必须在固定点之前和之后明确重复charset正则表达式。

答案 1 :(得分:2)

如果情况无关紧要,根据您使用的语言,您可能会使用此

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

\w匹配[A-Za-z0-9_]


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

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

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

这个人为的例子并没有为您节省太多,但根据您的regexen可以获得的复杂程度,这可以避免您不必复制您的角色类。另外,在构建带有字符串的正则表达式时,不要忘记\\转义斜线。


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

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

答案 2 :(得分:2)

我不知道lua是否支持这种语法,(它在perl中运行,因此可能与PCRE一起使用):

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

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

答案 3 :(得分:0)

某些语言允许在变量中存储正则表达式,或者从字符串构建它们。例如,在Perl中你可以这样做:

my $re_l = qr/[a-z0-9:_-]+/;
my $re   = qr/^$re_l\.$re_l$/;

答案 4 :(得分:0)

积极的LOOKAHEAD
/^(?=.*[^.]\.[^.])[a-z0-9:_.-]+$/ - 至少有一个点由非点字符包围 /^(?=^([^.]+\.)+[^.]+$)[a-z0-9:_.-]+$/ - 至少有一个点,每个点都被非点字符包围