我是一个彻头彻尾的正则表达式新手,花了好几个小时试图解决这个难题。 我想我必须使用某种可选的非捕获组或交替。
我要匹配以下字符串:
Neuer Film a von 1000
Neuer Film a von 1000 mit b
Neuer Film a von 1000 mit b und c
Neuer Film a von 1000 mit b und c und d
Neuer Film a mit b
Neuer Film a mit b und c
Neuer Film a mit b und c und d
我的正则表达式是这样的:
var regex = /(?:[nN]euer [Ff]ilm\s?)(.*)(?:[vV]on).(\d{4}).(?:[Mm]it)(.*)(?:[uU]nd)(.*)/g;
问题是它只匹配字符串3和4。它不匹配最后两个“und”,而是打包在3号组而不是4号组。
有人可以帮助我的正则表达式吗(这对用户来说根本不是很友好;)
最佳答案
您确实需要使用非捕获可选 组(如(?:...)?),但除此之外,您还需要 anchor (^ 匹配字符串的开头,$ 匹配字符串的结尾)和惰性点匹配模式( .*?,以匹配尽可能少的任何字符)。
你可以使用
/^[nN]euer [Ff]ilm\s*(.*?)(?:\s*[vV]on\s+(\d{4}))?(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?$/
参见 regex demo .在演示中,/gm 修饰符是必需的,因为输入是多行字符串。
图案细节:
^ - 字符串 anchor 的开始[nN]euer [Ff]ilm - Neuer 胶片/Neuer 胶片/neuer 胶片 \s* - 零个或多个空格(.*?) - 第 1 组:除换行符之外的任何 0+ 个字符,尽可能少(即,直到出现 最左边随后的子模式)(?:\s*[vV]on\s+(\d{4}))? - 出现 1 次或 0 次:
\s* - 0+ 个空格[vV]on - von 或 Von\s+ - 1+ 个空格(\d{4}) - 第 2 组:4 位数字(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)? - 一个可选的非捕获组匹配 1 次或 0 次出现:
\s+ - 1+ 个空格[Mm]it - Mit 或 mit\s* - 0+ 个空格(.*?) - 第 3 组匹配除换行字符以外的任何 0+ 个字符,尽可能少(?:\s*[uU]nd\s*(.*))? - 可选的非捕获组匹配
\s*[uU]nd\s* - und 或 Und 包含 0+ 个空格(.*) - 第 4 组匹配除换行字符以外的任何 0+ 个字符,尽可能多$ - 字符串结尾。var strs = ['Neuer Film a von 1000','Neuer Film a von 1000 mit b','Neuer Film a von 1000 mit b und c','Neuer Film a von 1000 mit b und c und d','Neuer Film a mit b','Neuer Film a mit b und c','Neuer Film a mit b und c und d'];
var rx = /^[nN]euer [Ff]ilm\s*(.*?)(?:\s*[vV]on\s+(\d{4}))?(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?$/;
for (var s of strs) {
var m = rx.exec(s);
if (m) {
console.log('-- ' + s + ' ---');
console.log('Group 1: ' + m[1]);
if (m[2]) console.log('Group 2: ' + m[2]);
if (m[3]) console.log('Group 3: ' + m[3]);
if (m[4]) console.log('Group 4: ' + m[4]);
}
}
关于javascript - 正则表达式可选的非捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43354986/
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案
这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我想从rubyrake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调