【问题标题】:How to match regex at start index?如何在开始索引处匹配正则表达式?
【发布时间】:2023-03-04 20:45:01
【问题描述】:

我如何创建一个 在开始搜索的地方开始匹配的正则表达式

换句话说:

\A 的等价物是“在搜索的开头匹配,即使它不在主字符串的开头”?

new Regex(@"\A\n").IsMatch("!\n", 1);    // Should be true, but is false

【问题讨论】:

  • @NullUserExceptionఠ_ఠ:我将在一个很长的循环中执行此操作,因此成本会很高。

标签: c# .net regex


【解决方案1】:

你要找的是\G:

new Regex(@"\G\n").IsMatch("!\n", 1);    // It's twue, it's twue!

事实上,这对我来说是一个惊喜。我知道\G,但它通常被描述为匹配输入的开头或最近成功匹配的结尾的锚,这两者都不适用。如果这是 .NET 创新,他们应该对此大加关注;看起来很方便。

编辑:想一想,Java 的find(int) 确实以同样的方式工作——我什至广泛使用它。但后来他们在 Java 5 中添加了“区域”API,它提供了更精细的控制,我忘记了这个习惯用法。我从没想过要在 .NET 中寻找它。

【讨论】:

  • 我不敢相信这是周二! +1
  • +1 哇,你找到了!看起来它自.NET 1.1 以来就一直存在
【解决方案2】:

哦,我刚刚想起了大约 4 到 5 年前在一本关于 Regex.Match 的书中读到的内容...

重载的行为不像我们预期的那样!

超载

Regex.Match(string input, int index, int length)

指定要搜索的子字符串,而重载

Regex.Match(string input, int index)

仅仅规定了搜索应该从哪里开始

(我猜它忽略了从 子字符串 中的 任意 位置开始的一种情况。)

希望这对人们有所启发......

【讨论】:

  • +1。是的,原来new Regex(@"\A\n").Match("!\n", 1, 2).Success 也是 twue。那些狡猾的小恶魔!
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多