标签: regex-lookarounds

匹配'/'或字符串结尾的正向预测

我正在尝试做一个积极的预测,以匹配给定URL中的对象ID,无论该对象ID在URL中的何处.想要匹配,直到字符串的'/'或结尾.以下是一些示例字符串(粗体是我想要匹配的ID):

  • / objects/obj_asd-1234-special
  • / objects/obj_xyz-15434/members
  • / objects/obj_aasdfaeastd-15d44/other/asdf

使用这个:objects/obj _(.+?)(?= /)匹配后两个,因为它们都有一个尾部斜杠.我读到前瞻支持正则表达式作为匹配字符,所以我尝试了这个对象/ obj _(.+?)(?=(/ | $))无济于事.有什么想法吗?

regex regex-lookarounds

6
推荐指数
3
解决办法
5051
查看次数

使用`\ R`进行Java-8正则表达式负向观察

回答另一个问题时,我写了一个正则表达式来匹配所有空格,最多包括一个换行符.我使用负面的lookbehind为\Rlinebreak matcher 做了这个:

((?<!\R)\s)*
Run Code Online (Sandbox Code Playgroud)

之后我正在思考它,我说,哦,不,如果有一个\r\n?当然它会抓住第一个破线的角色\r,然后我会\n在下一个弦的前面陷入虚假,对吗?

所以我回去测试(并且可能修复)它.但是,当我测试模式时,它匹配整个模式\r\n.它与人们可能期望的\r离开不匹配\n.

"\r\n".matches("((?<!\\R)\\s)*"); // true, expected false
Run Code Online (Sandbox Code Playgroud)

然而,当我使用中提到的"等价物"模式文档\R,它返回false.这是Java的一个错误,还是它有匹配的正当理由?

java regex java-8 regex-lookarounds

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

如何在正则表达式中使用带有字符的"环视"来捕获整个字符串?

我必须找到仅由字母'a'和'b'组成的所有字符串,并且'a'的每个实例后面紧跟'b'并且紧跟在'b'之后.

例如:

mystring = 'bab babab babbab ab baba aba xyz'
Run Code Online (Sandbox Code Playgroud)

然后我的正则表达式应该返回:

['bab' 'babab' 'babbab']  
Run Code Online (Sandbox Code Playgroud)

(在字符串'ab'中 - 'a'前面没有'b'.类似地'aba'和'xyz'不仅仅是'a','b'.)

我使用了lookahead为此写了这个正则表达式:

re.findall(r'((?<=b)a(?=b))',mystring)
Run Code Online (Sandbox Code Playgroud)

但这只会让我回复所有'a'的实例,这些实例后跟/前面跟'b',如:

['a','a','a','a']
Run Code Online (Sandbox Code Playgroud)

但我需要完整的话.如何使用正则表达式找到整个单词?我尝试用各种选项修改我的正则表达式,但似乎没有任何效果.如何才能做到这一点?

python regex state-machine regex-group regex-lookarounds

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

后视模式中的无效模式

为什么这个正则表达式在 Python 中有效,而在 Ruby 中无效:

/(?<!([0-1\b][0-9]|[2][0-3]))/
Run Code Online (Sandbox Code Playgroud)

很高兴听到解释以及如何在 Ruby 中解决它

使用整行代码进行编辑:

re.sub(r'(?<!([0-1\b][0-9]|[2][0-3])):(?!([0-5][0-9])((?i)(am)|(pm)|(a\.m)|(p\.m)|(a\.m\.)|(p\.m\.))?\b)' , ':\n' , s)
Run Code Online (Sandbox Code Playgroud)

基本上,我试图添加'\n'冒号而不是时间。

ruby python regex regex-lookarounds

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

JS Regex 后视在 Firefox 和 safari 中不起作用

我有以下正则表达式,它在 chrome 中工作,但在 firefox 或 safari 中导致错误。我需要修改它以使其工作。有人可以帮助一个可怜的灵魂吗?提前致谢!

正则表达式: /(?=<tag>)(.*?)(?<=<\/tag>)/

基本上,我必须匹配之间的任何字符<tag></tag>并且需要保留两个标签。我使用这个表达式作为 array.split 的参数。

输入: "The quick brown <tag>fox</tag> jumps over the lazy <tag>dog</tag>"

操作: input.split(正则表达式)

输出: ["The quick brown ", "<tag>fox</tag>", " jumps over the lazy ", "<tag>dog</tag>"]

javascript regex firefox regex-lookarounds

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

环视术语中的“无”[RAKU]

我正在阅读有关“嵌套结构的波浪号”的正则表达式文档。

关于使用的副业解释<?>是:

这里<?>成功匹配了空字符串。

我以为我可以使用<?[]>它来代替它,但它没有这样做!

举个例子:

say so "" ~~ / <?> /;
say so "test" ~~ / <?> /;

say so "" ~~ / <?[]> /;
say so "test" ~~ / <?[]> /;
Run Code Online (Sandbox Code Playgroud)

响应:

True
True

False
False
Run Code Online (Sandbox Code Playgroud)

有人可以给我一个解释吗?

regex-lookarounds raku

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

如何在 Rust 中正确使用`peek()`?

我正在尝试做一些简单的事情。在切片中u8,我想找到两个字符的出现"\r\n"。但是,我无法将该切片转换为Stringusingfrom_utf8因为切片之后的部分"\r\n"可能不是 utf-8 并且我尽可能不想使用from_utf8_unchecked. 所以我尝试了类似以下的方法。

fn find_crlf(text: &[u8]) -> Option<usize> {
    let mut textiter = text.iter().peekable();

    for (idx, &elem) in textiter.enumerate() {
        if Some(&elem) == Some(&b'\r') {
            if textiter.peek() == Some(&&b'\n') {
                return Some(idx);
            }
        }
    }
    None
}
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误,这是可以理解的。但是,我不太确定如何去做。如果是str,那就是.find("\r\n")

编译错误->

fn find_crlf(text: &[u8]) -> Option<usize> {
    let mut textiter = text.iter().peekable();

    for (idx, &elem) in textiter.enumerate() {
        if Some(&elem) == Some(&b'\r') {
            if textiter.peek() …
Run Code Online (Sandbox Code Playgroud)

iterator peek rust regex-lookarounds

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

R中的环视正则表达式模式

我坚持创建正确的正则表达式模式,该模式将拆分我的数据框列的内容,而不会让我失去任何元素。我必须使用包中的separate()函数,tidyr因为这是较长处理管道的一部分。由于我不想丢失字符串中的任何元素,因此我正在开发一个前瞻/后视表达式。

需要拆分的字符串可以遵循以下模式之一:

  • 只有字母(例如'abcd')
  • 字母-破折号-数字(例如'abcd-123')
  • 字母-数字(例如'abcd1234')
    列内容应最多分为 3 列,每组一列。

我想在每次元素更改时拆分,所以在字母和破折号之后。可以有一个或多个字母、一个或多个数字,但只能有一个破折号。只包含字母的字符串,不需要拆分。

这是我尝试过的:

library(tidyr) 
myDat = data.frame(drugName = c("ab-1234", 'ab-1234', 'ab-1234',
                                'placebo', 'anotherdrug', 'andanother',
                                'xyz123', 'xyz123', 'placebo', 'another',
                                'omega-3', 'omega-3', 'another', 'placebo'))
drugColNames = paste0("X", 1:3) 

# This pattern doesn't split strings that only consist of number and letters, e.g. "xyz123" is not split after the letters.
pat = '(?=-[0-9+])|(?<=[a-z+]-)'

# This pattern splits at all the right places, but the last group (the numbers), is separated and not …
Run Code Online (Sandbox Code Playgroud)

regex r regex-lookarounds tidyr

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

令人惊讶但正确的贪婪子表达式在积极的后视断言中的行为

注意

  • 观察到的行为是正确的,但起初可能令人惊讶;对我来说是这样,我认为对其他人也可能是这样——尽管对那些非常熟悉正则表达式引擎的人可能不是这样。

  • 重复建议的重复项Regex lookahead、lookbehind 和 atomic groups包含有关环视断言的一般信息,但没有解决手头的具体误解,如下面的评论中更详细地讨论。


使用greedy,根据定义,在肯定的后视断言中的可变宽度子表达式可以表现出令人惊讶的行为。

为了方便起见,这些示例使用 PowerShell,但该行为通常适用于 .NET 正则表达式引擎:

这个命令按我直觉的预期工作:

# OK:  
#     The subexpression matches greedily from the start up to and
#     including the last "_", and, by including the matched string ($&) 
#     in the replacement string, effectively inserts "|" there - and only there.
PS> 'a_b_c' -replace '^.+_', '$&|'
a_b_|c
Run Code Online (Sandbox Code Playgroud)

下面的命令,该命令使用正向后看断言,(?<=...)看似等价-但不是: …

.net regex regex-greedy regex-lookarounds

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

std::regex - 前瞻断言并不总是有效

我正在编写一个模块,该模块将一些字符串替换为文本以提供给脚本语言。该语言的语法模糊不清,因此表达式以括号和空格分隔的符号为界,其中大多数以 '$' 开头。像这样的正则表达式似乎应该在适当的符号边界处给出匹配:

auto re_match_abc = std::regex{ "(?=.*[[:space:]()])\\$abc(?=[()[:space:]].*)" };
Run Code Online (Sandbox Code Playgroud)

但是在我的环境中(Visual C++ 2017, 15.9.19,targeting C++-17)它可以匹配前面没有合适边界的字符串:

std::cout << "  $abc   -> " << std::regex_replace(" $abc ", re_match_abc, "***") << std::endl;
std::cout << " ($abc)  -> " << std::regex_replace("($abc)", re_match_abc, "***") << std::endl;
std::cout << "xyz$abc  -> " << std::regex_replace("xyz$abc ", re_match_abc, "***") << std::endl;
std::cout << " $abcdef -> " << std::regex_replace(" $abcdef", re_match_abc, "***") << std::endl;

// Result from VC++ 2017:
//
//       $abc   ->  ***
//      ($abc)  -> (***)
// …
Run Code Online (Sandbox Code Playgroud)

c++ regex regex-lookarounds

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