【问题标题】:Extract text before _ in a string using regex使用正则表达式提取字符串中 _ 之前的文本
【发布时间】:2019-02-02 02:05:50
【问题描述】:

我有一些以DD_filename 开头的字符串。

如何使用正则表达式提取_ 之前的字符。

我尝试使用from here 进行学习,因为给定a.b 将检索从a 开始并以b 结束的字符

我尝试过类似的^._,但它不适合我。

【问题讨论】:

  • 您可以使用正则表达式...但似乎更有可能拆分它会更容易和高效。

标签: regex


【解决方案1】:

^._ 只会匹配_ 之前的一个字符。试试这个模式:

^.*?(?=_)

【讨论】:

  • 这和^.*(?=_)有什么区别?另外,如果有多个下划线,使用[^_]*.*?而不是.*会更好吗?
  • 我无法想象零宽度断言需要后视的单一情况。
【解决方案2】:

从字符串的开头开始,捕获所有非下划线字符:

"^[^_]*"

第一个^(插入符号)字符表示匹配从字符串的开头开始。括号允许您定义一组可能的字符(字符类)。第二个^ 字符表示“不是”。所以字符类是“非下划线”。星星的意思是“零或更多”。所以用简单的英语:“从字符串的开头匹配零个或多个非下划线字符”。

【讨论】:

    【解决方案3】:

    你可以试试

    .*?(?=_)
    

    . 匹配任何字符,*?reluctant quantifier(?=_)positive lookahead 以确保我们的匹配后跟 _

    如果您只想提取出现在字符串开头的字符,您可以添加^ 锚点:^.*?(?=_)^ 匹配字符串中第一个字符之前的位置。

    【讨论】:

      【解决方案4】:

      只捕获所有不是下划线的字符:

      "[^_]*"
      

      【讨论】:

      • 这意味着什么,简而言之就是“任何不是下划线的字符(^ 在括号中表示“不是”)重复 0 次或更多次(即 * ).
      【解决方案5】:

      Regular Expression to get all characters before "-"

      查看@stema 的回答。他给出了四种方法来做到这一点,但第一种可能是最好的。

      Match result = Regex.Match(text, @"^.*?(?=-)");
      
      Console.WriteLine(result);
      

      【讨论】:

      • 不要忘记,如果您在发布后意识到已经发布了另一个答案(更好或相同),则删除您的帖子是免费的,以避免与不正确的答案混淆问题'不要添加任何东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      相关资源
      最近更新 更多