(*SKIP) 或 (*F) 在正则表达式上如何工作?

2024-01-01

我正在学习正则表达式的高级用法,并注意到许多帖子使用(*SKIP) or (*F) in it.

我发布了一个问题,其想法是匹配没有的行yellow但有blue除非brown存在于蓝色之后。正确的答案是:

.*yellow.*(*SKIP)(*F)|^.*\bblue\b(?=.*brown).*$

我也尝试过如下所示的环视表达式,但并未适用于所有情况:

^((?!yellow).)*blue(?=.*brown).*$

我对这些一无所知(*SKIP)(*F)标志,所以问题是,这些标志是如何工作的?他们在做什么?还有其他类似的标志吗?

Thanks.


这两个回溯控制动词仅在 Perl、PCRE 和pypi正则表达式模块 https://pypi.python.org/pypi/regex.

的想法(*SKIP)(*FAIL)技巧是消耗您想要避免的字符,并且这些字符不能成为匹配结果的一部分。

使用此技巧的经典模式如下所示:

What_I_want_to_avoid(*SKIP)(*FAIL)|What_I_want_to_match

正则表达式引擎处理这样的字符串:

  • 从左到右对每个字符测试模式的第一个标记(大多数时候默认情况下,但是一些正则表达式引擎可以设置为从右到左工作,如果我没记错的话.net可以做到这一点)

  • 如果第一个标记匹配,则正则表达式引擎使用下一个字符测试模式的下一个标记(在第一个令牌匹配之后) etc.

  • 当令牌失败时,正则表达式引擎会获取最后一个令牌匹配的字符,并尝试另一种方法来使模式成功(如果它也不起作用,正则表达式引擎会对之前的标记等执行相同的操作。)

当正则表达式引擎满足(*SKIP) verb (在这种情况下,所有之前的令牌显然都成功了),它不再有权返回到左侧的所有先前标记,也不再有权使用模式的另一个分支或在字符串中的下一个位置重试所有匹配的字符,直到最后一个匹配的字符(包括)如果该模式稍后在右侧失败(*SKIP) verb.

的作用(*FAIL)是迫使模式失败。因此左侧的所有字符都匹配(*SKIP)被跳过,正则表达式引擎在这些字符之后继续其工作。

在示例模式中,该模式成功的唯一可能性是第一个分支之前失败(*SKIP)允许测试第二个分支。

你可以找到另一种解释here https://stackoverflow.com/questions/19992984/verbs-that-act-after-backtracking-and-failure/20008790#20008790.

About Java and other regex engines that don't have these two features

回溯控制动词未在其他正则表达式引擎中实现,并且没有等效项。

但是,您可以使用多种方法来完成相同的操作(更清楚地说,是为了避免可能与模式的其他部分匹配的内容).

捕获组的使用:

way 1:

What_I_want_to_avoid|(What_I_want_to_match)

只需要提取捕获组1(或测试它是否存在),因为这就是您正在寻找的东西。如果使用模式进行替换,则可以使用匹配结果的属性(偏移量、长度、捕获组)来使用经典字符串函数进行替换。其他语言如 javascript、ruby...允许使用回调函数作为替代。

way 2:

((?>To_avoid|Other_things_that_can_be_before_what_i_want)*)(What_I_want)

这是更简单的替换方式,不需要回调函数,替换字符串只需要以\1 (or $1)

环顾四周的使用:

例如,您想要找到一个未嵌入其他两个单词之间的单词(比方说S_word and E_word是不同的(参见Qtax评论)):

(边缘情况S_word E_word word E_word and S_word word S_word E_word本例中允许。)

回溯控制动词方式将是:

S_word not_S_word_or_E_word E_word(*SKIP)(*F)|word

要使用这种方式,正则表达式引擎需要在一定程度上允许可变长度后视。使用.net或新的正则表达式模块,没有问题,lookbehinds可以具有完全可变的长度。 Java 也可以,但大小必须受到限制(例子:(?<=.{1,1000})).

Java 等效项将是:

word(?:(?!not_S_word_or_E_word E_word)|(?<!S_word not_E_word{0,1000} word))

请注意,在某些情况下,仅需要前瞻。还要注意,以文字字符开始模式比以后行开始更有效,这就是为什么我把它放在单词后面(即使我需要在断言中再次重写该词。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(*SKIP) 或 (*F) 在正则表达式上如何工作? 的相关文章

随机推荐

  • Azure 资源标识符格式 URI -URL 或 URN

    我正在使用 Azure 我注意到它为每个资源组和资源创建了一个如下所示的 ID 对于资源组 subscriptions
  • R download.file 使用“wget”方法并指定额外的 wget 选项

    我有一个关于使用的可能相当基本的问题download fileR 中的函数使用wget选项并使用一些 wget 额外选项 但我就是无法让它工作 我想做的 下载一个网页的本地副本 实际上是几个网页 但目前的挑战是让它即使只有 1 个也能工作
  • 导轨联系表不起作用

    我正在尝试创建一个提交表单的联系人 但我没有收到任何电子邮件 在我的 config application rb 中我添加了 config action mailer raise delivery errors true config ac
  • AngularJS 向路由添加授权

    如何向 AngularJS 和 ui router 添加授权 我正在使用 modulg ng oauthhttps github com andreareginato oauth ng https github com andrearegi
  • Linq 查询具有分组依据

    RowNum IMAGEID SCANEDATE COUNT 1 10000131 2012 07 04 00 00 00 000 1 2 10002626 2012 08 03 00 00 00 000 1 3 10003348 2012
  • React:ref 不是 prop

    使用 React js 时 为什么我得到 ref is not a prop key is not a prop error Notes 但是我在使用 webpack dev server 运行时没有遇到此错误 我没有ref or key在
  • 使用字符串作为函数参数

    我确信这很简单 但我找不到解决方案 我想使用包含字符串的变量作为函数的参数 x lt c 1 10 myoptions lt trim 0 na rm FALSE 现在 像 foo lt mean x myoptions 应该是一样的 fo
  • git 撤消受保护分支上的提交?

    有没有办法撤消受保护分支上的提交 我的意思是 如果您推送了错误的提交 在非受保护的分支上 您可以将 HEAD 重置为最后一个所需的提交 或者恢复错误的提交并强制推送 从而撤消它 但受保护的分支不允许强制推送 对于这种情况 有什么方法可以解决
  • 如何确定寄存器是否从右到左加载,反之亦然

    在查看 gdb 输出并查看汇编调用时 通常我可以找到一个使用硬编码值的命令来确定寄存器是否从右到左加载 反之亦然 通常类似于以下内容 sub rsp 16 or sub 16 rsp 但其他时候 没有像上面这样的值可见 我所看到的都是类似以
  • Symfony 2 支持部分表单绑定吗?

    我的问题 Symfony 2 支持吗PATCH请求 或任何类型的partial表单内容提交 如果是这样 是否有 正确 或更准确地说 首选 方法来做到这一点 除了PRE BIND 见下文 事件方法 还有其他模式或方法来解决这个问题吗 如果有其
  • Haskell 函数返回存在类型

    是否可以编写一个 Haskell 函数来生成隐藏了确切类型参数的参数化类型 IE 就像是f T gt exists a U a 明显的尝试 LANGUAGE ExistentialQuantification data D a D a da
  • 在 Windows Phone 8 中保存 LongListSelector 控件的滚动位置

    我需要保存 LongListSelector 位置 以便在返回页面后恢复它 首先 我将 GetItemsInView 与 WP7 一起使用 效果很好 然后用 WP8 它就消失了 我必须使用已实现项目 http msdn microsoft
  • 有没有办法告诉 Dropbox 不要上传某个文件? (日食相关)

    我正在尝试在两台计算机之间同步代码项目 一台运行 Windows 另一台运行 Ubuntu 12 04 我在两台机器上都使用 Eclipse 但是 元数据由于操作系统不兼容 Eclipse 生成的文件夹导致 Eclipse 崩溃 我想知道是
  • 说非确定性图灵机可以在多项式时间内解决 NP 问题会产生什么后果?

    这些天我一直在研究NP问题 计算复杂性和理论 我相信我终于掌握了图灵机的概念 但我有一些疑问 我可以接受 非确定性图灵机对于给定状态和正在读取的符号有几种选择 并且它总是会选择最佳选项 如维基百科所述 NTM 如何 知道 其中哪一个 应该采
  • 以高分辨率从网络摄像头捕获图片,同时使用 DirectShow.Net 以较低分辨率预览

    我正在使用 DirectShow Net 将网络摄像头流式传输到我的 C 4 0 应用程序以读取 QR 码 它每 0 5 秒拍摄一次快照 看看是否可以找到任何 QR 码并对其进行解码 这在我的开发计算机上在我可以使用网络摄像头的任何分辨率下
  • 实现一键登录以与后端交互

    我正在实施一键登录 如所描述的here https developers google com identity one tap android idtoken auth一切基本上都很好 我可以获得一个令牌 在后端验证它等等 但我有一个问题
  • 如何保护 Laravel 模型属性

    当使用其他框架或纯 PHP 时 我会保护我的模型属性 然后 我根据需要创建公共 getter 和 setter 并使用它们代理 get and set 这有助于我晚上睡觉 最近我开始使用 Laravel 我对 Eloquent 模型的 不受
  • 使用 Webpack 构建简单网站

    我第一次尝试让 webpack 工作 并且是在一个简单的网站上进行的 但是无论我尝试什么 它都无法正常工作 我已经坚持了好几个星期了 我认真地尝试了每一条线索 但都无济于事 我只需要一个对 webpack 没有问题的人来查看我的代码并提供有
  • 使用 NumberFormat 将带有货币符号的数值转换回十进制

    我想将以货币符号为前缀的可能的十进制值转换为仅数字值 例如 该值可以是以下任何一个 String s1 32 847 676 65 String s2 3 456 00 String s3 831 209 我希望转换后的结果是这样的 328
  • (*SKIP) 或 (*F) 在正则表达式上如何工作?

    我正在学习正则表达式的高级用法 并注意到许多帖子使用 SKIP or F in it 我发布了一个问题 其想法是匹配没有的行yellow但有blue除非brown存在于蓝色之后 正确的答案是 yellow SKIP F bblue b br