1

这是正则表达式:

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

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

4

3 回答 3

2

你有捕获组,使用它的值,但是你用你的语言来做。

JavaScript 示例:

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

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

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

在 Perl 中你也可以\K这样使用:

\.\K[^.]+
于 2012-06-13T16:11:27.437 回答
1

我不是 100% 确定你想要做什么,但让我们看看一些选项。

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

(次要注意:您不需要在.字符类 [..内部前面的反斜杠],因为 a.已经在那里失去了它的特殊含义。)

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

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

因此,正如所写,您的正则表达式通常会为您提供两个单独的结果:整个匹配的“.ns1”、“.ns2”等,以及子组匹配的“ns1”、“ns2”等. 您不必更改表达式即可获得后者的值;只需更改您访问比赛结果的方式。

但是,如果您愿意,并且您的正则表达式引擎支持它们,您可以使用某些功能来确保整个正则表达式只匹配您想要的部分。一种这样的机制是lookbehind。正向后视只会在匹配后向表达式的内容之后匹配:

/(?<\.)([^.]*)/

这将匹配任何非周期序列,但前提是它们在一个周期之后。

于 2012-06-13T16:33:54.327 回答
0

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

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

string myString = "bill.the.pony";
string[] brokenString = myString.split(".");
于 2012-06-13T16:05:11.073 回答