【问题标题】:Regex - how to ignore strings starting with underscore正则表达式 - 如何忽略以下划线开头的字符串
【发布时间】:2016-01-14 10:13:08
【问题描述】:

我需要测试这个字符串以匹配不以下划线开头的任何内容:

__$id0 = "foo"

我的方法是匹配以下划线开头的字符串,然后将该匹配变为否定的前瞻并捕获其余部分。

测试下划线工作:

(_.*?\s) 一击:'__$id0'

但是,将其设为负前瞻并不会产生预期的效果:

((?!_.*?\s).*?\s) 结果

MATCH 1
1.  [2-7]   `$id0 `
MATCH 2
1.  [7-9]   `= `
MATCH 3
1.  [9-16]  `"lala"`

下划线从第一个字符串中删除,但字符串本身仍在结果集中。我想完全排除第一个字符串,因为它以_ 开头。

如何排除以_ 开头的字符串?

结果应该是这样的:

MATCH 1
1.  [7-9]   `= `
MATCH 2
1.  [9-16]  `"lala"`

(来源:https://www.regex101.com/r/cC2pV7/1

【问题讨论】:

  • 只需将^ 放在最开始就可以从字符串的开头匹配。否则将从字符串的中间开始匹配。
  • 您希望结果是什么样的?
  • @saluce 添加了预期结果。
  • 你可以试试这个:(?!_)\s+([a-zA-z0-9$"=_]+)
  • @Grundy 之所以有效,是因为它与 \s 开头不匹配。将其更改为 \s* 并且您的正则表达式失败。让它在文本的中间,比如private string __$id0 = "lala",它就这样失败了。

标签: c# regex


【解决方案1】:

这是诀窍...匹配您不想保留的内容,然后匹配并捕获其他所有内容。

[\s]?_[^\s]*|\s?(.*?)\s+?

| 管道的左侧,您将匹配以下划线开头的任何内容。如果匹配,它将采用正则表达式的那一侧。否则,尝试匹配下划线的右侧,它会被捕获并匹配不以下划线开头的任何内容。

这还允许您在字符串中间或末尾出现下划线时进行匹配。

https://www.regex101.com/r/cC2pV7/3

【讨论】:

    【解决方案2】:

    您应该首先使用^ 检查行首。然后,你想匹配任何 不是下划线的东西,所以你使用倒排字符类:[^_]:

    ^([^_].*?)\s*=\s*(.*?)
    

    Working example

    【讨论】:

    • 1.) 最后,我想在一大块文本上使用它;我不认为起始锚会帮助我,但我会尝试 \b 。 2.)我想捕获用空格分隔的每个单个单词,除了带有下划线的单词。我试过修改这个来做到这一点,但它只是回到剥离_
    • 或者你也可以检查前面的空格(因为那些变量名不太可能有空格,对吧?)
    【解决方案3】:

    我知道这个标签,而且一切似乎都说必须使用正则表达式,但如果它对某人有帮助,怎么样:

    string_to_compare[0] =! '_'
    

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多