【问题标题】:Skip first nn characters, take the rest with RegEx跳过前 n 个字符,使用 RegEx 处理其余字符
【发布时间】:2016-03-16 14:05:42
【问题描述】:

在 Notepad++/pcre/PHP \K 中重置匹配的起点。在 .Net 风格的正则表达式中没有这种能力。

如何跳过指定数量的字符?

我创建了一个模式来对 ^.{15} 进行替换,这消除了前 15 个字符....我是在正确的轨道上,还是有更好的方法?

【问题讨论】:

  • Mastering Regular Expressions or Regular Expression Cookbook 那些不是旧书吗?你为什么认为它们适用于现代正则表达式? \K 构造相对较新,它表示不包括到目前为止匹配的内容,同时仍在使用文本。它可以作为可变宽度的后视,但也可以用于在您搜索时不包含固定宽度的文本。

标签: .net regex


【解决方案1】:

在 PCRE、Oniguruma、Boost、ICU 正则表达式中\K is a kind of a lookbehind construct

这种构造有一种特殊形式,称为 \K(自 Perl 5.10.0 起可用),它会导致正则表达式引擎“保留”它在 \K 之前匹配的所有内容,而不是将其包含在 @ 987654329@。 这有效地提供了可变长度的后视。允许在另一个环视断言中使用\K,但目前尚未明确定义该行为。

在 .NET 中,\K 不是必需的,因为它有 variable-width (or infinite-width) lookbehind

(?<=subexpression) 是一个积极的后向断言;也就是说,当前位置之前的一个或多个字符必须匹配子表达式

要匹配前 15 个字符后的数字,请使用

(?<=^.{15})\d

demo

不要忘记,要使点匹配换行符,您需要使用RegexOptions.Singleline

来自rexegg.com的备注:

支持无限宽度后视的仅有两种编程语言风格是 .NET(C#、VB.NET 等)和 Matthew Barnett 的regex module 用于 Python。

还有一个好处:您当前的要求并不意味着您依赖于无限宽度的后视。只需使用捕获组:

var s = Regex.Replace("1234567890123456", @"^(.{15})\d", "$1*");

最后一个6 将被* 替换,并且开头将使用$1 反向引用在结果字符串中恢复。

【讨论】:

  • 加一个以获得额外信息。它有助于填写我的理解。
【解决方案2】:

从技术上讲,这些角色不会被跳过,因为它们被消耗并被视为比赛的一部分。如果你想跳过字符,那么你需要看看后面

(?<=(.){15})

【讨论】:

    【解决方案3】:

    试试(?&lt;=.{15}).+

    在这里玩:http://refiddle.com/2te3

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2022-12-18
      相关资源
      最近更新 更多