【问题标题】:Regex find string by START-END pattern, with "options"正则表达式按 START-END 模式查找字符串,带有“选项”
【发布时间】:2017-10-24 10:58:36
【问题描述】:

我知道标题可能令人困惑,所以这是我需要做的:

Dim str = "blablabla blabla text-+-123.ipt blablabla sometext-+-456.iam bla someothertext-+-789.ipt blabla thistext+++000.doc"

我想要的输出是一个数组/字符串列表:

123,456,789

目前我正在尝试:Regex.Matches (str, ".*\-\+\-(.*)[(.iam)(.ipt)]") 接近,但还不够接近 :)

目标:返回所有以 "-+-" 开头并以 (".iam" OR ".ipt") 结尾的子字符串 - 不包含模式本身

SORRY:可能会产生误导,输出字符串不一定是数字!

【问题讨论】:

    标签: .net regex vb.net


    【解决方案1】:

    您可以使用捕获数字

    -\+-(.*?)\.(?:iam|ipt)
    

    请参阅regexstorm demo。您也可以将其写为-\+-(.*?)\.i(?:am|pt),以使其更高效但可读性更低。

    详情

    • -\+- - -+- 文字子字符串
    • (.*?) - 除换行符以外的任何 0+ 字符都尽可能少
    • \. - 一个点
    • (?:iam|ipt) - iamipt 子字符串

    VB.net 代码:

    Dim matches As List(Of String) = Regex.Matches(text, "-\+-(.*?)\.i(?:am|pt)") _
                                             .Cast(Of Match)() _
                                             .Select(Function(m) m.Groups(1).Value) _
                                             .ToList()
    

    【讨论】:

    • 我用例中的 (\d+) -> (.*) 除外
    • @dba 好吧,这取决于实际数据的样子。您发布了一个带有数字的字符串。
    • 支持详细解释,不知道 (?:iam|ipt) 语法
    • 并编辑了我关于这个的问题......无论如何,你的解决方案有效我只是添加了免费字符串的替代品,如果有人(在正则表达式方面没有经验 - 像我一样)偶然发现这个
    【解决方案2】:

    感谢参与,找到了使用命名捕获组的解决方案:

    Dim reg As New Regex("-\+-(?<Number>.*?)[(\.iam)(\.ipt)]") Dim m = reg.Matches(str).Cast(Of Match).Select(Function(x) x.Groups("Number")).ToArray()

    【讨论】:

    • [(.iam)(.ipt)] 错了,不如把\. 放在这里。
    • [(.iam)(.ipt)] 匹配单个字符:(.iam)p,@987654332到[(.iam)pt]。它是一个正字符类,它不匹配字符序列,而是匹配其中的任何字符。
    • 好吧,你说得对,它给出了正确的结果,所以我不在乎 :)
    【解决方案3】:
    const string pattern = @"[-][+][-](\d+)[.][ipt|iam]";
    

    不是数字

    const string pattern = @"[-][+][-]([^.]+)[.][ipt|iam]";
    

    提取匹配项

    var matches = regex.Matches(input);
    foreach (Match match in matches)
    {
        var content = match.Groups[1].Value;
    }
    

    var results = matches.OfType<Match>().Select(m => m.Groups[1].Value).ToArray();
    

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多