标签: backreference

JavaScript - 字符串正则表达式反向引用

你可以在JavaScript中反向引用这样的:

var str = "123 $test 123";
str = str.replace(/(\$)([a-z]+)/gi, "$2");
Run Code Online (Sandbox Code Playgroud)

这将(非常愚蠢)用"test"替换"$ test".但想象一下,我想将结果字符串$ 2传递给一个函数,该函数返回另一个值.我尝试这样做,但不是得到字符串"测试",我得到"$ 2".有没有办法实现这个目标?

// Instead of getting "$2" passed into somefunc, I want "test"
// (i.e. the result of the regex)
str = str.replace(/(\$)([a-z]+)/gi, somefunc("$2"));
Run Code Online (Sandbox Code Playgroud)

javascript regex backreference

90
推荐指数
2
解决办法
5万
查看次数

替换字符串中的反向引用语法(为什么是美元符号?)

在Java中,它似乎在少数其他语言,在模式的反向引用由一个反斜杠(如前面\1,\2,\3,等),但在替换字符串他们一个美元符号前面(例如$1,$2,$3,和也$0).

这是一个片段来说明:

System.out.println(
    "left-right".replaceAll("(.*)-(.*)", "\\2-\\1") // WRONG!!!
); // prints "2-1"

System.out.println(
    "left-right".replaceAll("(.*)-(.*)", "$2-$1")   // CORRECT!
); // prints "right-left"

System.out.println(
    "You want million dollar?!?".replaceAll("(\\w*) dollar", "US\\$ $1")
); // prints "You want US$ million?!?"

System.out.println(
    "You want million dollar?!?".replaceAll("(\\w*) dollar", "US$ \\1")
); // throws IllegalArgumentException: Illegal group reference
Run Code Online (Sandbox Code Playgroud)

问题:

  • $在Java中特有的替换字符串中使用反向引用是什么?如果没有,用什么语言开始呢?什么口味使用它,什么不使用?
  • 为什么这是个好主意?为什么不坚持使用相同的模式语法?这不会导致更具凝聚力和更容易学习的语言吗?
    • 如果上面的语句1和4是"正确的"而不是2和3,语法是否会更加简化?

java regex syntax backreference replace

47
推荐指数
2
解决办法
3万
查看次数

否定正则表达式中的反向引用

如果字符串具有此预测格式:

value = "hello and good morning"
Run Code Online (Sandbox Code Playgroud)

其中"(引用)也可能是'(单引号),而结束字符('或")与开头字母相同.我想匹配引号之间的字符串.

\bvalue\s*=\s*(["'])([^\1]*)\1
Run Code Online (Sandbox Code Playgroud)

(这两个是允许=符号附近的任何空格)

第一个"捕获的组"(在第一对括号内) - 应该与开头的引号匹配,后者应该是'或'然后 - 我应该允许任何数量的字符不是第一组中捕获的字符,然后我期待在组中捕获的字符(括号引号).

(必须在第二个捕获组中捕获所需的字符串).
但这不起作用.

这样做:

\bvalue\s*=\s*(['"])([^"']*)["']
Run Code Online (Sandbox Code Playgroud)

但我想确保开始和结束引号(双重或单引号)是相同的.


编辑
目标基本上是获取一个锚的开始标记,该锚具有包含在其类属性中的某个类名,我想要涵盖类属性的罕见情况,包括(')或().

根据这里的所有建议,我使用了以下模式:

<\s*\ba\b[^<>]+\bclass\s*=\s*("|'|\\"|\\')(?:(?!\1).)*\s*classname\s*(?:(?!\1).)*\1[^>]*>
Run Code Online (Sandbox Code Playgroud)

含义:
找一个标记 - 开放标志.
允许任何空格.
找到单词 a.
允许任何非关闭标记.
找到"class(任何空格)=(任何空格)"
获取开场引号,以下之一:("或'或\"或\').
来自Alan Moore的回答:允许任何不是开头报价的字符.
find classname
允许任何不是开头引号的字符.
找到与开头相同的收盘价.
允许任何unclosing-tag字符.
找到结束标记char.

regex backreference negate regex-group

41
推荐指数
1
解决办法
1万
查看次数

搜索/替换中的Notepad ++ Regex Backreference语法 - \1或$ 1

我试图使用Notepad ++ Search/Replace with Regular Expression将特定单词替换为这些单词的较短版本.


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

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

Replace with: $1

但它不会取代匹配的单词,即使它找到了它们.

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

Replace with: \1

一切正常.


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

两种形式的后退有什么区别 - \1$1

regex backreference replace escaping notepad++

35
推荐指数
1
解决办法
3万
查看次数

R:环顾四周

我需要匹配前面有两个不同元音的'r'.例如,'我们'或'梨'将匹配,但'bar'或'aar'不匹配.我确实设法匹配两个不同的元音,但我仍然不能使...后续'r'的lookbehind 条件().既(?<=...)r不会...\\Kr产生任何结果.有任何想法吗?

x <- c('([aeiou])(?!\\1)(?=(?1))')
y <- c('our','pear','bar','aar')
y[grepl(paste0(x,collapse=''),y,perl=T)]
## [1] "our"  "pear"`
Run Code Online (Sandbox Code Playgroud)

regex backreference r

33
推荐指数
3
解决办法
775
查看次数

当我使用分组时,如何使用gsub对Ruby正则表达式(regex)进行反向引用?

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

t="First sentence. Second sentence.Third sentence."
Run Code Online (Sandbox Code Playgroud)

在第二句末尾的点之后没有空格.这标志着第3个句子在原始文档中的单独行(在br标记之后).

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

t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2)
Run Code Online (Sandbox Code Playgroud)

不过遗憾的是它不工作:"NoMethodError:未定义的方法`+"的零:NilClass"我怎样才能正确地反向引用匹配的群体?在Microsoft Word中这么简单,我只需要使用\ 1和\ 2符号.

ruby regex backreference reference gsub

23
推荐指数
3
解决办法
2万
查看次数

正则表达式中的反向引用如何使回溯成为必需?

我阅读了http://swtch.com/~rsc/regexp/regexp1.html,其中作者说,为了在正则表达式中进行反向引用,在匹配时需要回溯,这使得最坏情况的复杂度呈指数级增长.但我并不确切地知道为什么反向引用会引入回溯的必要性.有人可以解释为什么,也许提供一个例子(正则表达式和输入)?

regex complexity-theory computer-science backreference time-complexity

20
推荐指数
3
解决办法
2624
查看次数

绕过sed反向引用限制\ 1到\ 9

sed手册明确指出,替代字符串中可用的替代字符串可用的编号为\ 1到\ 9.我正在尝试解析一个包含10个字段的日志文件.

我为它形成了正则表达式,但是第十场比赛(以及之后的任何内容)都无法访问.

有没有人有一种优雅的方法来规避KSH中的这种限制(或者我可以移植到shell脚本的任何语言)?

regex shell backreference sed

17
推荐指数
2
解决办法
7518
查看次数

RewriteCond中的%N反向引用

我正在研究虚拟域系统.我有一个通配符DNS设置为*.loc,我正在尝试处理我的.htaccess文件.以下代码有效:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC]
RewriteCond %{REQUEST_URI} !^/example/
RewriteRule (.*) /example/$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

但是,我希望这可以与我放入的任何内容一起使用.但是,我需要%{REQUEST_URI}对作为域的文本进行检查.我尝试使用此代码:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?([a-zA-Z0-9-]*.)?([a-zA-Z0-9-]+)\.loc$ [NC]
RewriteCond %{REQUEST_URI} !^/%3/
RewriteRule (.*) /%3/$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

但该行RewriteCond %{REQUEST_URI} !^/%3/导致我的代码抛出内部服务器错误.我理解这是因为我的代码中有%N,但有没有办法可以使用它?我需要这一行,否则,我的代码会因内部重定向而失败.

我希望这对某人有意义.我需要的是能够在后面的RewriteCond中反向引用RewriteCond.

apache .htaccess mod-rewrite backreference wildcard-subdomain

17
推荐指数
1
解决办法
6030
查看次数

Python正则表达式替换:从数字中单独反向引用

在正则表达式替换模式中,反向引用看起来像\1.如果要在该反向引用后包含一个数字,这将失败,因为该数字被认为是反向引用号的一部分:

# replace all twin digits by zeroes, but retain white space in between
re.sub(r"\d(\s*)\d", r"0\10", "0 1")
>>> sre_constants.error: invalid group reference
Run Code Online (Sandbox Code Playgroud)

替换模式r"0\1 0"可以正常工作,但在失败的示例中,反向引用\1被解释为\10.

如何将数字'0'\1之前的反向引用分开?

python regex backreference

16
推荐指数
2
解决办法
3793
查看次数