我有一个单词列表:
bau
ceu
diu
fou
gau
Run Code Online (Sandbox Code Playgroud)
我想将该列表转换为:
byau
cyeu
dyiu
fyou
gyau
Run Code Online (Sandbox Code Playgroud)
我没有成功尝试这个命令:
:%s/(\w)(\w\w)/\1y\2/g
Run Code Online (Sandbox Code Playgroud)
鉴于这不起作用,我需要更改什么才能使正则表达式捕获组在Vim中工作?
这是一系列教育正则表达式文章的第二部分.它显示了向前看符号和嵌套引用如何可以用来匹配非正规languge ñ b ñ.嵌套引用首先介绍在:这个正则表达式如何找到三角形数字?
其中一种原型非常规语言是:
L = { a
ñb
ñ: n > 0 }
这是所有非空字符串的语言,由一些数字a
后跟相同数量的字符串组成b
.在这个语言字符串的例子有ab
,aabb
,aaabbb
.
这种语言可以通过泵浦引理显示为非规则的.它实际上是一种原型上下文无关语言,可以通过无上下文语法 生成S ? aSb | ab
.
尽管如此,现代正则表达式实现清楚地认识到的不仅仅是常规语言.也就是说,它们不是形式语言理论定义的"规则".PCRE和Perl支持递归正则表达式,.NET支持平衡组定义.更少的"花哨"特征,例如反向引用匹配,意味着正则表达式不规则.
但这个"基本"功能有多强大?L
例如,我们可以用Java正则表达式识别吗?我们也许可以结合lookarounds和嵌套引用,并具有与如工作模式String.matches
来匹配字符串一样ab
,aabb
,aaabbb
,等?
java.util.regex.Pattern
我希望这行JavaScript:
"foo bar baz".match(/^(\s*\w+)+$/)
Run Code Online (Sandbox Code Playgroud)
返回类似的东西:
["foo bar baz", "foo", " bar", " baz"]
Run Code Online (Sandbox Code Playgroud)
但它只返回最后捕获的匹配:
["foo bar baz", " baz"]
Run Code Online (Sandbox Code Playgroud)
有没有办法获得所有捕获的匹配?
我在urls.py中有以下正则表达式,我想知道这意味着什么.特别(?P<category_slug>
是正则表达式的一部分.
r'^category/(?P<category_slug>[-\w]+)/$
假设我有这段代码:
val string = "one493two483three"
val pattern = """two(\d+)three""".r
pattern.findAllIn(string).foreach(println)
Run Code Online (Sandbox Code Playgroud)
我希望findAllIn
只返回483
,但相反,它返回了two483three
.我知道我可以使用unapply
只提取那部分,但我必须有一个整个字符串的模式,如:
val pattern = """one.*two(\d+)three""".r
val pattern(aMatch) = string
println(aMatch) // prints 483
Run Code Online (Sandbox Code Playgroud)
有没有另一种方法来实现这一点,而不使用java.util
直接的类,而不使用unapply?
这是一系列教育正则表达式文章的一部分,这是对嵌套引用概念的温和介绍.
前几个三角形数字是:
1 = 1
3 = 1 + 2
6 = 1 + 2 + 3
10 = 1 + 2 + 3 + 4
15 = 1 + 2 + 3 + 4 + 5
Run Code Online (Sandbox Code Playgroud)
有很多方法可以检查数字是否为三角形.有一种有趣的技术使用正则表达式如下:
^(\1.|^.)+$
以下是一些片段,表明它适用于多种语言:
$r = '/^(\1.|^.)+$/';
foreach (range(0,50) as $n) {
if (preg_match($r, str_repeat('o', $n))) {
print("$n ");
}
}
Run Code Online (Sandbox Code Playgroud)
for (int n = 0; n <= 50; …
Run Code Online (Sandbox Code Playgroud) 我想匹配像一个正则表达式/(a).(b)(c.)d/
使用"aabccde"
,并获得以下信息反馈:
"a" at index = 0
"b" at index = 2
"cc" at index = 3
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?String.match返回匹配列表和完整匹配开始的索引,而不是每个捕获的索引.
编辑:一个不适用于普通indexOf的测试用例
regex: /(a).(.)/
string: "aaa"
expected result: "a" at 0, "a" at 2
Run Code Online (Sandbox Code Playgroud)
注意:问题类似于Javascript Regex:如何查找每个子表达式的索引?,但我不能修改正则表达式,使每个子表达式成为一个捕获组.
经过几个小时的搜索,我决定问这个问题.为什么这个正则表达式:^(dog).+?(cat)?
不起作用,因为我认为它应该工作(捕获第一只狗和猫,如果有的话)?我在这里错过了什么?
dog, cat
dog, dog, cat
dog, dog, dog
Run Code Online (Sandbox Code Playgroud) 在scala.util.matching.Regex trait MatchData中我看到支持组名,我认为这与(Regex Named Capturing Groups)有关
但是由于Java在版本7之前不支持组名,因为我理解它(参考),Scala版本2.8.0(Java HotSpot(TM)64位服务器VM,Java 1.6.)给了我这个例外:
scala> val pattern = """(?<login>\w+) (?<id>\d+)""".r
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio
us maximum length near index 11
(?<login>\w+) (?<id>\d+)
^
at java.util.regex.Pattern.error(Pattern.java:1713)
at java.util.regex.Pattern.group0(Pattern.java:2488)
at java.util.regex.Pattern.sequence(Pattern.java:1806)
at java.util.regex.Pattern.expr(Pattern.java:1752)
at java.util.regex.Pattern.compile(Pattern.java:1460)
Run Code Online (Sandbox Code Playgroud)
所以问题是Scala支持的命名捕获组?如果是这样的话有什么例子吗?
capturing-group ×10
regex ×10
java ×2
javascript ×2
regex-group ×2
scala ×2
string ×2
c# ×1
django ×1
lookaround ×1
optional ×1
python ×1
repeat ×1
vim ×1