标签: lookbehind

正则表达式模式与某些扩展名不匹配?

我写了这个模式

^.*\.(?!jpg$|png$).+$
Run Code Online (Sandbox Code Playgroud)

但是有一个问题 - 这个模式匹配file.name.jpg(2个点)

它在filename.jpg上正常工作(不匹配).我试图弄清楚如何使它与任何.jpg文件不匹配,即使文件的名称中有2个或更多点.我尝试使用后面的外观,但python抱怨没有使用固定宽度(我不完全确定这意味着什么,但文件名将是可变长度.)

python regex lookbehind

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

如何仅在字符串的开头替换重复字符/单词的模式?

请注意,这个问题是在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)

regex pcre lookbehind julia regex-lookarounds

8
推荐指数
1
解决办法
798
查看次数

Javascript/RegExp:Lookbehind Assertion导致"无效组"错误

我正在做一个简单的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.

javascript regex jquery match lookbehind

7
推荐指数
2
解决办法
5119
查看次数

如何在C#Regex中使用lookbehind以跳过重复前缀模式的匹配?

如何在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.

c# regex lookbehind

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

Ruby中的正则表达式负面看起来似乎不起作用

制作一个参数解析器.我想将一个字符串拆分成一个数组,", "除了前面的分隔符"|".这意味着字符串

"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: /(?<!\|), /

ruby regex string negative-lookbehind lookbehind

6
推荐指数
1
解决办法
2504
查看次数

stringr,str_extract:如何做正面的lookbehind?

非常简单的问题.我只需要使用正则表达式正向后观捕获一些字符串,但我没有办法做到这一点.

这是一个例子,假设我有一些字符串:

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)

它抱怨需要一个"有限的最大长度",但我不知道在哪里指定.我如何做出积极的外观工作?确切地说,我可以指定这个"有界最大长度"吗?

regex r lookbehind stringr

6
推荐指数
2
解决办法
2484
查看次数

正则表达式:匹配空格之间的单词

我试图用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|^)但似乎不可能,因为"后视需要固定宽度模式".

python regex whitespace lookahead lookbehind

6
推荐指数
1
解决办法
1941
查看次数

量词范围不适用于后视

好的,所以我正在开发一个项目,我需要一个正则表达式,可以匹配*后跟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)旗帜.

php regex lookbehind quantifiers

5
推荐指数
1
解决办法
1016
查看次数

.NET Regex Lookbehind不贪心

如何让后视变得贪婪?
在这种情况下,我希望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)

只要你放一些肯定的后?那么它可选择贪婪的游戏.出于同样的原因,我不得不将$放在前面.
但是如果你需要以可选的贪婪结束,那么必须使用下面接受的答案.

.net regex lookbehind

5
推荐指数
1
解决办法
588
查看次数

使用.NET正则表达式在引号之间解析文本

我有以下输入文字:

@"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)

.net c# regex lookahead lookbehind

5
推荐指数
1
解决办法
209
查看次数