当前位置: 首页 > 面试题库 >

RegEx BackReference以匹配不同的值

濮波
2023-03-14
问题内容

我有一个正则表达式,用于匹配表格的表达式 (val1 operator val2)

这个正则表达式看起来像:

(\(\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*\))

正如您在本演示中看到的那样,这实际上很好,并且与我想要的匹配

但是:D(黄油来了)

我想通过使其更易读和“紧凑”来优化正则表达式本身。我搜索了如何执行此操作,然后找到了一种称为反向引用的名称,您可以在其中命名捕获组,然后像下面这样引用它们:

(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*(\g{Val})\s*\))

我在其中命名了捕获表达式左侧的组,Val后来我将其引用为(\g{Val}),现在的 问题
是,仅在表达式左侧与右侧完全相同的情况下,您才能在此处看到此表达式!例如(a==a)(1==1),并且与(a==b)!之类的表达式不匹配。

现在的问题是:有没有办法引用模式而不是匹配的值?


问题答案:

请注意,这\g{N}等效于\1,即, 反向引用 与相应的捕获组匹配的相同
(而不是模式)匹配。不过,这种语法稍微灵活一些,因为您可以通过在数字之前使用来定义
对于当前组的捕获组-(即\g{-2}(\p{L})(\d)\g{-2}将匹配a1a)。

PCRE引擎允许 子例程调用
来递归子模式。要重复Group 1的模式,请使用(?1)(?&Val)递归已命名group的模式Val

另外,您可以使用字符类来匹配单个字符,并考虑使用?量词使正则表达式的某些部分可选:

(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|[*\/+-]|[=!><]=|[><])\s*((?&Val))\s*\))

见正则表达式演示

请注意,\'.*\'\[.*\]可能匹配太多,请考虑用\'[^\']*\'和替换\[[^][]*\]



 类似资料:
  • 我对从有序对象列表中获取子列表的Y方法感兴趣。子列表应该以一个对象开始,该对象匹配一个与它的属性相关的给定条件,它应该以一个对象匹配一个不同的条件结束。 假设我有以下类: 我需要从(包括)到(包括)的子列表,保持它在源列表中的顺序,将放在一边。 我知道如何在不使用流的情况下做到这一点(比如查找开始和结束的索引,然后将元素从index获取到index),这可能已经足够了,但有些过时,不能真正满足我对

  • 我有一个使用stringType匹配文件名的协定。契约还指定了type上的匹配器,但当我在提供者端运行测试时,它会执行字面匹配。我在调试时包含了合同、发送的JSON和一个屏幕截图。我注意到TypeMatcher是在MatchingRuleGroup中初始化的,但它没有字段。我不确定这是否正确 我尝试了3种方案: > StringValue(“bestandSID”,“20190219_foo_20

  • 我正在为我的博客站点使用正则表达式模式,使URL地址成为可点击的链接,这非常有效。该模式具有以下格式: 但在不久的过去,我发现这个模式也匹配文件名,所以当用户在评论中发布一些文件名时,系统会将其作为链接。您可以在此处看到这种效果: 我试图实现的是匹配除最后一个示例(见下图)之外的所有URL格式,因此或将不会突出显示。 输入应该匹配的内容: 输入不应匹配的内容: URL格式是什么样子的? 对于这种情

  • 我尝试检查密码与功能password_verify发布的用户密码和散列从数据库。 首先,我如何生成密码和哈希: 登录时验证: 总是收到密码错误的消息。我阅读了这个php密码\u散列和密码\u验证问题没有匹配,但我手动测试了散列字符串,以验证文本字符串。 哈希字符串:$2y$10$SwSq7OukPpN/QJ8YOdKgquJQ28fQbNY1Q3JdTFnoe。2VxD/D2RXBS 通过电子邮件

  • 我想同时执行精确的单词匹配和部分单词/子字符串匹配。例如,如果我搜索“test product”,那么我应该能够在结果中找到“test”和“product”相关的文本。我用下面的match查询搜索弹性搜索,它不是给我精确的匹配,而是给我一些更多的不确定的匹配。示例是在结果中给出与“sample”相关的文本。 我使用弹性搜索6.3 请在下面找到我的查询 搜索结果:“Hits”:[{“_index”:

  • 问题内容: 我正在努力从我们的数据库中淘汰某个客户。我注意到一种趋势,人们用与他们填写公司名称相同的名字来填写名字。因此,示例如下所示: 这些人是我不想被查询的人。他们是坏蛋。我正在尝试将查询与WHERE语句(大概)组合在一起,以隔离姓氏至少与公司名称部分匹配的人,但是我很困惑,可以使用一些帮助。 问题答案: 您可以采用基于相似性的方法 在答案底部尝试代码 它会产生如下结果 因此,您将能够根据相似