问题标签 [backreference]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
270 浏览

parsing - How to back reference AST in custom rewrite action?

I already know the workaround for this problem, but I would like to really use this one approach, for at least one reason -- it should work.

This is rule taken from "The Definitive ANTLR Reference" by Terence Parr (the books is for ANTLR3):

If INT is not followed by + the result will be INT (single node), if it is -- subtree will be built with first INT (referred as $expr) as left branch.

I would like to build similar rule, yet with custom action:

ANTLR accepts such rule, but when I run my parser with input (for example) "5 * 3" it gives me an error "line 1:1 missing EOF at '*'5".

QUESTION: how to use back reference with custom rewrite action?

0 投票
2 回答
926 浏览

regex - 无法使用 sed 进行分组

这按预期工作:

输入文件 src.txt:

命令:

结果如预期:

那么为什么这些不能按预期工作:

命令:

预期的:

实际结果:

命令:

预期的:

实际结果

括号似乎不适用于分组,但我发现的所有教程和示例似乎都认为它们应该......

0 投票
2 回答
217 浏览

python - 在 Python 正则表达式中捕获否定匹配

我正在尝试进行非贪婪的否定匹配,我也需要捕获它。我在 Python 中使用这些标志,re.DOTALL | 重新本地化 | re.MULTILINE,对一些文本文件“数据库”进行多行清理,其中每个字段都以反斜杠开始新行。每条记录都以 \lx 字段开头。

我试图确保每个 \ge 字段在其记录中的某个位置上方都有一个 \ps 字段,一对一。目前,一个 \ps 后面经常跟几个 \ge ,因此需要复制下来,就像上面的两个单独的 \ge 一样。

以下是大部分需要的逻辑:在任何 \ps 字段之后,但在遇到另一个 \ps 或 \lx 之前,先找到一个 \ge,然后再找到另一个 \ge。捕获所有内容,以便可以将 \ps 字段复制到第二个 \ge 之前。

这是我的非功能性尝试。替换这个:

有了这个:

即使在一个小文件(34 行长)上,我也会遇到内存错误。当然,即使这可行,我也必须多次运行它,因为它只是试图处理第二个 \ge,而不是第三个或第四个。所以这方面的任何想法也会让我感兴趣。

更新: Alan Moore 的解决方案效果很好,尽管有些情况需要稍作调整。可悲的是,我不得不关闭 DOTALL,否则我无法阻止第一个 .* 包括随后的 \ps 字段——即使是非贪婪的 .*? 形式。但是我很高兴刚才在正则表达式点信息中了解了 (?s) 修饰符。这使我可以在一般情况下关闭 DOTALL,但仍可在其他必要的正则表达式中使用它。

这是建议的正则表达式,浓缩为我需要的单行格式:

那行得通,但是当我修改上面的示例时,它在“注释 2”上方插入了 \ps。它还将 \lxs 和 \ge2 与 \lx 和 \ge 相同(需要一些 \b)。所以,我选择了一个稍微调整的版本:

这个替换字符串:

再次感谢!

0 投票
1 回答
33084 浏览

regex - 搜索/替换中的 Notepad++ 正则表达式反向引用语法 - \1 或 $1

我尝试使用带有正则表达式的 Notepad++ 搜索/替换来用这些单词的较短版本替换特定单词。


我使用以下正则表达式匹配以er(但不是er作为单词)结尾的每个单词 - 并使用反向引用将匹配的单词替换为减去结尾的相同单词r

Find what: ([a-zA-z]+e)r

Replace with: $1

但它不会替换匹配的单词,即使它找到了它们。

但是,如果我将反向引用语法更改为:

Replace with: \1

一切正常。


为什么$1反向引用不起作用?

两种形式的反向引用有什么区别 -\1$1

0 投票
1 回答
615 浏览

php - 在没有括号的情况下对RegEx中以竖线分隔的选项进行分组?

是否可以在不使用括号的情况下对正则表达式的部分进行分组?或者,换句话说,与某些括号内的陈述不匹配?这就是我的意思——考虑以下正则表达式:

现在。注意前两个子查询——带有竖线的子查询。我如何防止那些出现?如果$input是“他是谁”,我希望“他”是唯一匹配的子查询。

我明白,在这个例子中,我可以抓住$matches[3],这会给我正确的结果。但是,由于我的应用程序的性质,我正在动态生成正则表达式,并且结构不会总是像我在这个示例中那样。我可以有 X 个竖线分隔的子查询和 Y(.+)个子查询。我只想匹配(.+)那些。

是否有可能做到这一点?如有必要,我可以重写我的正则表达式,但我不知道如何在不使用括号的情况下对语句进行分组,括号标记子查询。如果重要的话,我正在使用 PHP。

谢谢!

0 投票
1 回答
610 浏览

python - Python Regex:转义反向引用

这是我的情况:

我想在 (itself) 之后附加 [\W(itself)] 是很简单的,因为它自己是一组字符(可以是特殊的)。这就是为什么我需要将它放在一个集合中以去除所有特殊含义。但是,我的组可以是一个 SET。我知道嵌套集不起作用。如何转义/删除方括号以安全地将我的组放入集合中?

我的另一个尝试是改用 \1(\W|\1)* ,但我需要转义组中的字符而不转义组中可能的方括号。我该怎么做?

这是一个两难的选择。我不知道如何解决这个问题以及该走哪条路。请帮忙。

非常感谢你。

编辑:我跳过了一步。在匹配一个字符但 \([^\] 部分)并用解释的表达式替换后,我有时需要用一组相似的字符替换它。所以,'a' 变成了 '[a@]','s' 变成了 '[s5$]',等等......这个问题真的是错误的。但是我解决了这个问题,所以如果你仍然试图从我之前写的东西中理解,请不要:)

0 投票
3 回答
18602 浏览

ruby - 使用分组时如何使用 gsub 在 Ruby 正则表达式 (regex) 中反向引用?

我想修补一些从网页中提取的文本数据。样本:

第二句末尾的点后面没有空格。这表明第 3 句在原始文档中位于单独的行中(在 br 标记之后)。

我想使用这个正则表达式将“\n”字符插入适当的位置并修补我的文本。我的正则表达式:

但不幸的是它不起作用:“NoMethodError: undefined method `+' for nil:NilClass” 如何正确反向引用匹配的组?在 Microsoft Word 中非常简单,我只需要使用 \1 和 \2 符号。

0 投票
1 回答
60 浏览

javascript - javascript正则表达式反向引用

这是php正则表达式的延续:电话号码7-12位可能包含连字符或空格

我仍在尝试理解反向引用。以下是我用来测试反向引用的 JavaScript 代码。当我运行此代码时,仅null输出。我哪里错了?

0 投票
1 回答
282 浏览

c# - c# 从反向引用中获取值

我正在尝试从如下所示的 XML 文件中提取数据库连接字符串:

现在理想情况下,我希望有一个团体回来

[0] = 数据源=Instance_1;用户 ID=;初始目录=DB1;提供者=SQLOLEDB.1;集成安全性=SSPI;自动翻译=False;

[1] = DB1

所以我有这个正则表达式:

所以我在第一个()中捕获了值,有没有办法可以做一个正则表达式来捕获完整的连接字符串和只有数据库?

0 投票
1 回答
295 浏览

python - 正则表达式:在匹配时间 {n} 中使用反向引用?

我想使用正则表达式来匹配字符串列表:1a, 2aa, 3aaa... 其中字符串中的第一个数字表示该数字后面有多少个 a。

我本能地认为反向引用可能会有所帮助,但事实并非如此。

在 Regex 中,我们可以使用反向引用来匹配先前捕获的子模式。例如,(.+) \1将匹配aaa aaa.

我可以在模式匹配时间使用反向引用{n}{n,m}还是{n,}

例如,\da{\1}理想情况下会匹配3aaa,但是,我用 python 构建模块测试了re它,它不起作用。编译器似乎将其理解\da{\1}为不同的文字:

这个功能是模块没有实现还是仅仅因为基本的正则表达式算法不能支持这个功能?