【问题标题】:Regex: Get anything before正则表达式:之前得到任何东西
【发布时间】:2016-03-04 21:42:40
【问题描述】:

我正在编写自己的 .INI 文件阅读器,并使其尽可能广泛和固定,以在许多情况下工作。

维基说一些程序使用';' cmets 使用分号,有些使用 '#' 哈希。

我正在尝试使用正则表达式来删除任何行值上的 cmets,这就是我想出的;

这是 INI 文本文件:

t1 = t2
t3 = t4 ;test
t5 = t6 #test

实际代码:

value = Regex.Match(value, ".*(?=;|#");

哪个有效!但只得到第二和第三行。

积极的前瞻 '(?=;|#")',我如何使它成为可选的?(比如,只有当它包含 ';' 或 '#' 然后子串它),希望我的目标很明确,如果不告诉我。

【问题讨论】:

  • 如果它是可选的前瞻,那么前瞻不会做任何事情。 “子串”是什么意思?
  • 我希望它在 ';' 之前返回任何内容或 '#' 如果那里有一个,如果没有就全部返回。

标签: c# regex ini


【解决方案1】:

你可以使用这个:

^[^;#]*

这将匹配每个非 ;或 # 字符串开头的字符。如果 ;或 # 不存在,一切都会匹配。否则,它将仅匹配最多 ; 的字符或#。

如果您不想匹配空行,请使用:

^[^;#]+

【讨论】:

  • 我将如何扭转这种情况?我有“[test]l=l”,我想在“]”之后得到“l=l”,但它也可能不包含“[test]”?
  • 非常相似:[^]]*$
  • 我只能每 90 分钟发布一个问题。不过,我将在这里粘贴我写的内容:
  • 嗨,我有字符串:“[test]t4=kdf8” 我想在“[test]”之后和“=kdf8”之前抓取“t4”,但是“test”可以是任何东西,并且“kdf8”可以是任何东西。到目前为止,使用来自@Szymon 的正则表达式,我有: value = Regex.Match(value, "[^]]*$");它抓住了“t4 = kdf8”部分,现在我希望也只抓住“t4”部分(全部在一个正则表达式调用中),我宁愿不要低效地多次使用正则表达式来分解它一块一块的。
  • 这是一个很好的断言用例——你想匹配两个字符 ] 和 = 之间的东西:(?<=]).*(?==)
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2013-08-17
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多