Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式的多重匹配_Regex_String_Vba - Fatal编程技术网

Regex 正则表达式的多重匹配

Regex 正则表达式的多重匹配,regex,string,vba,Regex,String,Vba,我有以下示例字符串ABC\uu hdsiugid\u 23123\u FGH1\u sdfkjk\u FGH2 不过,我想做的是捕获FGH1和FGH2,同时确保我的模式以ABC开头 当我尝试惰性模式时,ABC.+?(FGH\d)我得到了FGH1,而贪婪模式ABC.+(FGH\d)我得到了FGH2。如何修改模式以捕获FGH1和FGH2 Sub RexTest() Dim rex As New RegExp rex.Pattern = "ABC.+?(FGH\d)" ' or "AB

我有以下示例字符串
ABC\uu hdsiugid\u 23123\u FGH1\u sdfkjk\u FGH2

不过,我想做的是捕获
FGH1
FGH2
,同时确保我的模式以
ABC
开头

当我尝试惰性模式时,
ABC.+?(FGH\d)
我得到了
FGH1
,而贪婪模式
ABC.+(FGH\d)
我得到了
FGH2
。如何修改模式以捕获
FGH1
FGH2

Sub RexTest()
    Dim rex As New RegExp
    rex.Pattern = "ABC.+?(FGH\d)" ' or "ABC.+(FGH\d)"
    rex.Global = True
    Dim str As String: str = "ABC__hdsiugid_23123_FGH1_sdfkjk_FGH2"
    Dim mtch As Object
    For Each mtch In rex.Execute(str)
        Debug.Print mtch.SubMatches(0)
    Next
End Sub

编辑:我意识到我应该把我的问题说得更清楚(谢谢sln)。在我给出的示例字符串中,只有2个FGH[0-9],但实际上可能有任意数量的FGH[0-9]。

您可以使用如下正则表达式:

^(?:(?!ABC).)*|(FGH\d)

MATCH 1
1.  [20-24] `FGH1`
MATCH 2
1.  [32-36] `FGH2`
MATCH 3
1.  [51-55] `FGH3`
MATCH 4
1.  [80-84] `FGH4`
MATCH 5
1.  [92-96] `FGH5`
MATCH 6
1.  [117-121]   `FGH6`


你提到了VSTO。如果您能做到这一点,您可能能够从vba运行C#段。
我无法理解你是如何整理结果的

无论如何。下面是一个真正简单的正则表达式示例,它利用了捕获集合这一特性
应该是在所有的引擎,但只有网络有它,我想

通常,每次运行群集组表达式时都会覆盖捕获缓冲区,但是
MS只是将结果累加到一个数组中

这是

C#代码


ABC.+?(FGH\d)(?:*(FGH\d))?
但如果FGHx数量可变,这不是解决问题的方法,我已经编辑了我的问题,在我的情况下,我可以有一个可变数量的FGH[0-9]。我不认为vba使用“点网”引擎,否则它将是微不足道的。但是,这可以在线进行。外部循环:
(?m)^ABC(+
,内部循环:本地字符串=外部匹配的组1,然后在该字符串上设置
FGH(\d+)
。每个循环都是全局完成的,第一个循环正则表达式具有多行选项修饰符。感谢您的评论,我很想知道如何在点网中完成,我可以使用VSTO。就VBA嵌套循环而言,外循环模式中的
m
是什么,循环迭代器是什么?发布了一个可以与VSTO一起使用的C#示例。感谢您的回答,不幸的是,只有在我们有2个FGH[0-9]的情况下,这才有效。感谢您的建议,但这并不完全有效,我再次获得一个FGH捕获onlyTanks以供您的建议,但是如果您有一个包含2个以上FGH的字符串,则仍然没有。例如,
ABC\uuuuhdsfgh0iu\ufgh4gid\u23\u123\ufgh1\usdfkjk\ufgh2
,使用正则表达式模式,只返回
FGH0
FGH4
,而所有4个都需要捕获
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Globalization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Regex FghRx = new Regex(
            @"
                 ^                   # Beginning of Line
                 ABC                 # Must be an 'ABC' at bol
                 (?:                 # START Cluster group
                      .*?                 # optional non-'FGH' (and not newlines)
                      ( FGH \d+ )         # (1), The FGH Capture Collection
                 )+                  # END Cluster group, do many times
            "
            , RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);

            string FghData =
                "ABC__hdsiugid_23123_FGH10_sdfkjk_FGH20                             \n" +
                "ABC__hdsiugid_23123_FGH11_sdfkjk_FGH21_dopqw_FGH31                 \n" +
                "ABC__hdsiugid_23123_FGH12_sdfkjk_FGH22_dopqw_FGH32                 \n" +
                "333333__ABC__hdsiugid_23123_FGH120_sdfkjk_FGH220_dopqw_FGH320      \n" +
                "ABC__hdsiugid_23123_FGH13_sdfkjk_FGH23_dopqw_FGH33_dopqw_FGH43     \n" +
                "ABC__hdsiugid_23123_FGH14_sdfkjk_FGH24_dopqw_FGH34_dopqw_FGH44     \n" +
                "333333__ABC__hdsiugid_23123_FGH121_sdfkjk_FGH221_dopqw_FGH321      \n" +
                "ABC__hdsiugid_23123_FGH15_sdfkjk_FGH25_dopqw_FGH35                 \n" +
                "ABC__hdsiugid_23123_FGH16_sdfkjk_FGH26_dopqw_FGH36                 \n" ; 

            Match FghMatch = FghRx.Match( FghData );
            while ( FghMatch.Success )
            {
                Console.WriteLine( "New Record\n------------------------" );
                CaptureCollection cc_fgh = FghMatch.Groups[1].Captures;

                for (int i = 0; i < cc_fgh.Count; i++)
                {
                    Console.WriteLine( "'{0}'", cc_fgh[i].Value );
                }
                FghMatch = FghMatch.NextMatch();
                Console.WriteLine( "------------------------\n" );
            }
            return;

        }
    }
}
New Record
------------------------
'FGH10'
'FGH20'
------------------------

New Record
------------------------
'FGH11'
'FGH21'
'FGH31'
------------------------

New Record
------------------------
'FGH12'
'FGH22'
'FGH32'
------------------------

New Record
------------------------
'FGH13'
'FGH23'
'FGH33'
'FGH43'
------------------------

New Record
------------------------
'FGH14'
'FGH24'
'FGH34'
'FGH44'
------------------------

New Record
------------------------
'FGH15'
'FGH25'
'FGH35'
------------------------

New Record
------------------------
'FGH16'
'FGH26'
'FGH36'
------------------------

Press any key to continue . . .