不要在正则表达式中包含条件本身

时间:2012-06-13 15:54:29

标签: regex

这是正则表达式:

/\.([^\.]*)/g

但对于字符串name.ns1.ns2,它会捕获.ns1和。ns2值(这确实很有意义)。是否只能获得ns1ns2结果?也许使用断言,nuh?

3 个答案:

答案 0 :(得分:2)

您拥有捕获组,使用其值,但是您使用您的语言。

JavaScript示例:

var list = "name.ns1.ns2".match(/\.([^.]+)/g);
// list now contains 'ns1' and 'ns2'

如果你可以使用lookbehinds(最现代的正则表达式,但不是JS),你可以使用这个表达式:

(?<=\.)[^.]+

在Perl中,您也可以使用\K,如下所示:

\.\K[^.]+

答案 1 :(得分:1)

我不是百分之百确定你要做什么,但让我们来看看。

你的正则表达式:/\.([^\.]*)/g

(次要注意:您不需要在. [内的]前面使用反斜杠,因为.失去了它的特殊性意思是那里已经。)

首先:与正则表达式匹配原则上是布尔测试:“这个字符串是否与此正则表达式匹配”。您可以获得的关于字符串的哪个部分与正则表达式的哪个部分匹配的任何其他信息完全取决于您正在使用的任何环境中正则表达式周围的特定实现。所以,你的问题本质上是依赖于实现的。

但是,在最常见的情况下,匹配尝试确实提供了额外的数据。您几乎总是得到与整个正则表达式匹配的子字符串(在Perl 5中,它显示在$&变量中)。在与Perl5兼容的正则表达式中,如果使用不带引号的括号括起正则表达式的一部分,您还将添加匹配每组的子串(在Perl 5中,它们放在$1中,{{ 1}}等。)。

所以,正如所写的那样,你的正则表达式通常会为你提供两个单独的结果:“。ns1”,“。ns2”等,用于整个匹配,“ns1”,“ns2”等等。子组匹配。您不必更改表达式以获取后面的值;只需更改您访问匹配结果的方式。

但是,如果需要,并且正则表达式引擎支持它们,则可以使用某些功能来确保整个正则表达式仅匹配所需的部分。一种这样的机制就是后视。积极的lookbehind只会在与lookbehind表达式匹配的东西后匹配:

$2

这将匹配任何非期间序列,但仅限于它们在一段时间之后。

答案 2 :(得分:0)

你可以使用字符串拆分之类的东西,它允许你将字符串分成特定字符串(例如句点)的片段吗?

目前尚不清楚您正在使用哪种语言,但几乎所有现代语言都提供了分割字符串的方法。例如,这个伪代码:

string myString = "bill.the.pony";
string[] brokenString = myString.split(".");