【问题标题】:Regex to extract substrings in C#正则表达式在 C# 中提取子字符串
【发布时间】:2017-11-18 22:05:11
【问题描述】:

我有一个字符串:

 string subjectString = @"(((43*('\\uth\Hgh.Green.two.190ITY.PCV')*9.8)/100000+('VBNJK.PVI.10JK.PCV'))*('ASFGED.Height Density.1JKHB01.PCV')/476)";

我的预期输出是:

Hgh.Green.two.190ITY.PCV
VBNJK.PVI.10JK.PCV
ASFGED.Height Density.1JKHB01.PCV

这是我尝试过的:

 Regex regexObj = new Regex(@"'[^\\]*.PCV");
 Match matchResults = regexObj.Match(subjectString);
 string val = matchResults.Value;

当输入字符串为 :"@"(((43*('\\uth\Hgh.Green.two.190ITY.PCV')*9.8)/100000+"; 但当字符串增长并且要提取的子字符串数量超过 1 时,此方法有效,我得到了不想要的结果。

如何从原始字符串中提取三个子字符串?

【问题讨论】:

    标签: c# .net regex c#-4.0


    【解决方案1】:

    您似乎想在.PCV 之前匹配单词和. 字符。

    使用

    [\w\s.]*\.PCV
    

    regex demo

    在开始时强制使用至少 1 个单词字符

    \w[\w\s.]*\.PCV
    

    如果需要,可以在开头添加一个单词边界:@"\b\w[\w\s.]*\.PCV"

    要强制 \w 仅匹配 ASCII 字母和数字(以及 _),请使用 RegexOptions.ECMAScript 选项编译正则表达式对象。

    这里,

    • \w - 匹配任何字母、数字或_
    • [\w\s.]* - 匹配 0+ 个空格、单词或/和 . 字符
    • \. - 文字 .
    • PCV - PCV 子字符串。

    示例用法:

    var results = Regex.Matches(str, @"\w[\w\s.]*\.PCV")
        .Cast<Match>()
        .Select(m=>m.Value)
        .ToList();
    

    【讨论】:

    • 我认为您需要转义“。”也,像这样:[\w\.]*\.PCV
    • @BG100:不,只有在字符类中 -]\^ 需要转义。 ] 如果是第一个字符则不需要转义,^ 如果不是第一个字符则不需要转义,- 如果是字符类中的第一个/最后一个字符则不需要转义。
    • 啊!我没有意识到这一点!刚刚尝试过,你是对的...... :)
    • @WiktorStribiżew:结果 [2] 是:“Density.1JKHB01.PCV”,但我需要“ASFGED.Height Density.1JKHB01.PCV”,尽管其他两个结果是正确的。
    • 在类中添加一个空格 - @"\w[\w\s.]*\.PCV" 然后。否则,请详细说明要求。除非您确定 delimiter 模式应该是什么样子,否则我仍然会在这里遵循白名单方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多