我写了这个模式
^.*\.(?!jpg$|png$).+$
Run Code Online (Sandbox Code Playgroud)
但是有一个问题 - 这个模式匹配file.name.jpg(2个点)
它在filename.jpg上正常工作(不匹配).我试图弄清楚如何使它与任何.jpg文件不匹配,即使文件的名称中有2个或更多点.我尝试使用后面的外观,但python抱怨没有使用固定宽度(我不完全确定这意味着什么,但文件名将是可变长度.)
请注意,这个问题是在Julia的背景下,因此(据我所知)是PCRE.
假设你有一个像这样的字符串:
"sssppaaasspaapppssss"
Run Code Online (Sandbox Code Playgroud)
并且你想单独匹配字符串末尾的重复字符(在我们的字符串的情况下,四个"s"字符 - 也就是说,matchall给出["s","s","s" ","s"],而不是["ssss"]).这很简单:
r"(.)(?=\1*$)"
Run Code Online (Sandbox Code Playgroud)
它实际上是微不足道的(并且很容易使用 - replace(r"(.)(?=\1*$)","hell","k")会给予"hekk"同时replace(r"(.)(?=\1*$)","hello","k")给予"hellk").并且可以通过将点切换为更复杂的点来重复模式:
r"(\S+)(?=( \1)*$)"
Run Code Online (Sandbox Code Playgroud)
例如,它将独立匹配"abc"的最后三个实例"abc abc defg abc h abc abc abc".
然后导致问题...如何匹配字符串开头的重复字符或模式,而不是?具体来说,以上面使用的方式使用正则表达式.
显而易见的方法是将上述正则表达式的方向反转为r"(?<=^\1*)(.)"- 但PCRE/Julia不允许lookbehinds具有可变长度(除非它是固定变量,例如(?<=ab|cde)),因此会抛出错误.下一个想法是使用"\ K"作为某些东西r"^\1*\K(.)",但这只能匹配第一个字符(可能是因为它匹配后"前进",不再匹配插入符号).
为清楚起见:我正在寻找一个正则表达式,例如,导致
replace("abc abc defg abc h abc abc abc",<regex here>,"hello")
Run Code Online (Sandbox Code Playgroud)
生产
"hello hello defg abc h abc abc abc"
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它从一开始用"你好"替换每个"abc",但直到第一次不匹配.我在上面提供的反向链接在字符串的另一端执行此操作:
replace("abc abc defg abc h abc abc abc",r"(\S+)(?=( \1)*$)","hello")
Run Code Online (Sandbox Code Playgroud)
产生
"abc abc defg abc h hello hello hello"
Run Code Online (Sandbox Code Playgroud) 我正在做一个简单的Lookbehind断言来获取URL的一部分(下面的示例)但是没有得到匹配,我得到以下错误:
Uncaught SyntaxError: Invalid regular expression: /(?<=\#\!\/)([^\/]+)/: Invalid group
Run Code Online (Sandbox Code Playgroud)
这是我正在运行的脚本:
var url = window.location.toString();
Run Code Online (Sandbox Code Playgroud)
url == http://my.domain.com/index.php/#!/write-stuff/something-else
// lookbehind to only match the segment after the hash-bang.
var regex = /(?<=\#\!\/)([^\/]+)/i;
console.log('test this url: ', url, 'we found this match: ', url.match( regex ) );
Run Code Online (Sandbox Code Playgroud)
结果应该是write-stuff.
任何人都可以解释为什么这个正则表达式组导致此错误?对我来说看起来像一个有效的RegEx.
我知道如何获得我需要的细分市场的替代方案,所以这只是帮助我了解这里发生的事情,而不是获得替代解决方案.
谢谢阅读.
J.
如何在C#Regex中使用lookbehind以跳过重复前缀模式的匹配?
示例 - 我正在尝试使表达式匹配b任意数量的字符后面的所有a字符:
Regex expression = new Regex("(?<=a).*");
foreach (Match result in expression.Matches("aaabbbb"))
MessageBox.Show(result.Value);
Run Code Online (Sandbox Code Playgroud)
返回aabbbb,lookbehind只匹配一个a.我怎样才能使它a与开头的所有s 匹配?
我试过了
Regex expression = new Regex("(?<=a+).*");
Run Code Online (Sandbox Code Playgroud)
和
Regex expression = new Regex("(?<=a)+.*");
Run Code Online (Sandbox Code Playgroud)
没有结果......
我期待的是bbbb.
制作一个参数解析器.我想将一个字符串拆分成一个数组,", "除了前面的分隔符"|".这意味着字符串
"foo, ba|, r, arg"
Run Code Online (Sandbox Code Playgroud)
应该导致
`["foo", "ba|, r", "arg"]`
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用这个正则表达式:(?<!\|),它在http://regexhero.net/tester/中有效,但是当我尝试时
args.split(/(?<!\|), /)
Run Code Online (Sandbox Code Playgroud)
在ruby中,我收到一个错误: undefined (?...) sequence: /(?<!\|), /
非常简单的问题.我只需要使用正则表达式正向后观捕获一些字符串,但我没有办法做到这一点.
这是一个例子,假设我有一些字符串:
library(stringr)
myStrings <- c("MFG: acme", "something else", "MFG: initech")
Run Code Online (Sandbox Code Playgroud)
我想提取带有"MFG:"前缀的单词
> result_1 <- str_extract(myStrings,"MFG\\s*:\\s*\\w+")
>
> result_1
[1] "MFG: acme" NA "MFG: initech"
Run Code Online (Sandbox Code Playgroud)
这几乎可以做到,但我不想包括"MFG:"部分,所以这就是"积极的观察背景":
> result_2 <- str_extract(myStrings,"(?<=MFG\\s*:\\s*)\\w+")
Error in stri_extract_first_regex(string, pattern, opts_regex = attr(pattern, :
Look-Behind pattern matches must have a bounded maximum length. (U_REGEX_LOOK_BEHIND_LIMIT)
>
Run Code Online (Sandbox Code Playgroud)
它抱怨需要一个"有限的最大长度",但我不知道在哪里指定.我如何做出积极的外观工作?确切地说,我可以指定这个"有界最大长度"吗?
我试图用python中的正则表达式做一些相当简单的事......这就是我至少想到的.
我想要做的是匹配字符串中的单词,如果它前面跟着一个空格.如果它位于字符串的开头,则之前不需要空格 - 如果它在结尾处,也不要搜索空格.
例:
"WordA WordB WordC-WordD WordE"
Run Code Online (Sandbox Code Playgroud)
我想要匹配WordA WordB WordE.
我只是想出了这样做的简单方法......
(?<=(?<=^)|(?<=\s))\w+(?=(?=\s)|(?=$))
Run Code Online (Sandbox Code Playgroud)
在我看来,这个简单的问题必须有一个简单的方法....我想我可以刚开始,(?<=\s|^)但似乎不可能,因为"后视需要固定宽度模式".
好的,所以我正在开发一个项目,我需要一个正则表达式,可以匹配*后跟1-4个空格或制表符,然后是一行文本.现在我正在使用.*在观察后进行测试.但是我可以让它明确匹配1,2或4个空格/制表符,但不能匹配1-4.我正在测试以下块
* test line here
* Second test
* Third test
* Another test
Run Code Online (Sandbox Code Playgroud)
这些是我正在测试的两种模式(?<=(\*[ \t]{3})).*,它们按照预期工作并匹配第二行,如果我用1,2或4替换3,那么如果我用1,4替换它形成以下模式(?<=(\*[ \t]{1,4})).*它不再匹配任何行和我老实说无法理解为什么.我试过谷歌搜索没有成功.我正在使用g(lobal)旗帜.
如何让后视变得贪婪?
在这种情况下,我希望lookbehind消耗:if is存在.
m = Regex.Match("From: John", @"(?i)(?<=from:)....");
// returns ' Jon' what I expect not a problem just an example
m = Regex.Match("From: John", @"(?i)(?<=from:?)....");
// returns ': Jo'
// I want it to return ' Jon'
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方法
@"(?i)(?<=\bsubject:?\s+).*?(?=\s*\r?$)"
Run Code Online (Sandbox Code Playgroud)
只要你放一些肯定的后?那么它可选择贪婪的游戏.出于同样的原因,我不得不将$放在前面.
但是如果你需要以可选的贪婪结束,那么必须使用下面接受的答案.
我有以下输入文字:
@"This is some text @foo=bar @name=""John \""The Anonymous One\"" Doe"" @age=38"
Run Code Online (Sandbox Code Playgroud)
我想用@ name = value语法解析值作为名称/值对.解析前一个字符串应该会产生以下命名的捕获:
name:"foo"
value:"bar"
name:"name"
value:"John \""The Anonymous One\"" Doe"
name:"age"
value:"38"
Run Code Online (Sandbox Code Playgroud)
我尝试了以下正则表达式,它几乎让我:
@"(?:(?<=\s)|^)@(?<name>\w+[A-Za-z0-9_-]+?)\s*=\s*(?<value>[A-Za-z0-9_-]+|(?="").+?(?=(?<!\\)""))"
Run Code Online (Sandbox Code Playgroud)
主要问题是它捕获了开头的报价"John \""The Anonymous One\"" Doe".我觉得这应该是一个后视而不是前瞻,但这似乎根本不起作用.
以下是表达式的一些规则:
名称必须以字母开头,并且可以包含任何字母,数字,下划线或连字符.
不带引号的必须至少包含一个字符,并且可以包含任何字母,数字,下划线或连字符.
带引号的值可以包含任何字符,包括任何空格和转义引号.
编辑:
以下是regex101.com的结果:
(?:(?<=\s)|^)@(?<name>\w+[A-Za-z0-9_-]+?)\s*=\s*(?<value>(?<!")[A-Za-z0-9_-]+|(?=").+?(?=(?<!\\)"))
(?:(?<=\s)|^) Non-capturing group
@ matches the character @ literally
(?<name>\w+[A-Za-z0-9_-]+?) Named capturing group name
\s* match any white space character [\r\n\t\f ]
= matches the character = literally
\s* match any white space character …Run Code Online (Sandbox Code Playgroud) lookbehind ×10
regex ×10
.net ×2
c# ×2
lookahead ×2
python ×2
javascript ×1
jquery ×1
julia ×1
match ×1
pcre ×1
php ×1
quantifiers ×1
r ×1
ruby ×1
string ×1
stringr ×1
whitespace ×1