捕获多个文本。

时间:2011-07-28 21:21:33

标签: regex qregexp

我的正则表达式有问题。

考虑我们有一个字符串

 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));
}

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

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

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

3 个答案:

答案 0 :(得分: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));
}

我希望这会有所帮助。

答案 1 :(得分:0)

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

尝试:

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

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

请注意,我还将.括起来,因为它在RegExp中有意义,而您似乎希望它是一个文字句点。

答案 2 :(得分:0)

我只知道.Net可以让你用一个
指定可变数量的捕获 表达。示例 - (捕获。* me)+
它创建了一个可以迭代的捕获对象。即便如此,它只模拟
每个其他正则表达式引擎提供的内容。

大多数引擎提供增量匹配,直到没有匹配 环。 global标志告诉引擎与最后一个保持匹配 成功的比赛离开了。

示例(在Perl中):

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