你可以在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) 在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中特有的替换字符串中使用反向引用是什么?如果没有,用什么语言开始呢?什么口味使用它,什么不使用?如果字符串具有此预测格式:
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.
我试图使用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?
我需要匹配前面有两个不同元音的'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) 我想修补从网页中提取的一些文本数据.样品:
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符号.
我阅读了http://swtch.com/~rsc/regexp/regexp1.html,其中作者说,为了在正则表达式中进行反向引用,在匹配时需要回溯,这使得最坏情况的复杂度呈指数级增长.但我并不确切地知道为什么反向引用会引入回溯的必要性.有人可以解释为什么,也许提供一个例子(正则表达式和输入)?
regex complexity-theory computer-science backreference time-complexity
sed手册明确指出,替代字符串中可用的替代字符串可用的编号为\ 1到\ 9.我正在尝试解析一个包含10个字段的日志文件.
我为它形成了正则表达式,但是第十场比赛(以及之后的任何内容)都无法访问.
有没有人有一种优雅的方法来规避KSH中的这种限制(或者我可以移植到shell脚本的任何语言)?
我正在研究虚拟域系统.我有一个通配符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
在正则表达式替换模式中,反向引用看起来像\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之前的反向引用分开?
backreference ×10
regex ×9
replace ×2
.htaccess ×1
apache ×1
escaping ×1
gsub ×1
java ×1
javascript ×1
mod-rewrite ×1
negate ×1
notepad++ ×1
python ×1
r ×1
reference ×1
regex-group ×1
ruby ×1
sed ×1
shell ×1
syntax ×1