2

我有正则表达式的问题。

考虑我们有一个字符串

 S= "[sometext1],[sometext],[sometext]....,[sometext]"

“sometexts”的数量是未知的,它是用户的输入,可以从 1 到 ..例如 1000 不等。

[sometext] 是一些字符序列,但每个字符都不是“,”,所以,我们可以说 [^,]。

我想通过一些正则表达式捕获文本,然后循环遍历文本。

QRegExp p=new QRegExp("???");
p.exactMatch(S);
for(int i=1;i<=p.captureCount;i++)
{
  SomeFunction(p.cap(i));
}

例如,如果某些文本的数量是 3,我们可以使用这样的东西:

([^,]*),([^,]*),([^,]*).

所以,我不知道该写什么来代替“???” 对于任意 n。我正在使用 Qt 4.7,我没有在类参考页面上找到如何执行此操作。
我知道我们可以通过没有正则表达式的循环或在循环中生成正则表达式本身来做到这一点,但这些解决方案不适合我,因为实际问题比这更复杂..

4

3 回答 3

3

匹配您想要的可能的正则表达式是:

([^,]+?)(,|$)

这将匹配以逗号“,”或行尾结尾的字符串。我不确定最后一个元素是否会昏迷。

在 C# 中使用此正则表达式的示例:

String textFromFile = "[sometext1],[sometext2],[sometext3],[sometext4]";

foreach (Match match in Regex.Matches(textFromFile, "([^,]+?)(,|$)"))
{
    String placeHolder = match.Groups[1].Value;

    System.Console.WriteLine(placeHolder);
}

此代码将以下内容打印到屏幕上:

[sometext1]
[sometext2]
[sometext3]
[sometext4]

使用我在网上找到的 QRegex 示例是一种尝试更接近您正在寻找的解决方案:(我发现的示例位于:http ://doc.qt.nokia.com/qq/qq01-seriously-weird- qregexp.html )

QRegExp rx( "([^,]+?)(,|$)");
rx.setMinimal( TRUE ); // this is if the Qregex does not understand the +? non-greedy notation.

int pos = 0;
while ( (pos = rx.search(text, pos)) != -1 ) 
{
     someFunction(rx.cap(1));
}

我希望这有帮助。

于 2011-07-28T22:31:34.813 回答
0

我们可以这样做,你可以使用非捕获来钩住逗号,然后请求许多块:

尝试:

QRexExp p=new QRegExp("([^,]*)(?:,([^,]*))*[.]")

文档中解释了非捕获:http: //doc.qt.nokia.com/latest/qregexp.html

请注意,我也将它括起来,.因为它在 RegExp 中具有含义,并且您似乎希望它是一个字面句点。

于 2011-07-28T21:29:28.937 回答
0

我只知道 .Net 允许您使用单个
表达式指定可变数量的捕获。示例 - (capture.*me)+
它创建一个可以迭代的捕获对象。即便如此,它也只模拟
了所有其他正则表达式引擎提供的东西。


大多数引擎提供增量匹配,直到循环内没有匹配为止。该标志告诉引擎从上次 成功匹配停止global的地方继续匹配。

示例(在 Perl 中):

while ( $string =~ /([^,]+)/g ) { print $1,"\n" }

于 2011-07-28T21:50:37.983 回答