标签: regex-lookarounds

在hgignore中奇怪的负向前瞻处理

在一个巨大的源代码树中,我希望Mercurial只跟踪一个子文件夹.

specific/component/subfolder
Run Code Online (Sandbox Code Playgroud)

在任何体面的正则表达式工具(Regex Coach,regexpal.com)中,以下内容绝对足够(并且可以理解)

^(?!specific/component/subfolder).+
Run Code Online (Sandbox Code Playgroud)

同时.hgignore坚持要

^(?!extras).+
^extras/(?!extensions).+
^extras/extensions/(?!sharing).+
Run Code Online (Sandbox Code Playgroud)

一旦我把斜线放在前瞻组中,没有任何东西可以通过.

在调用这个bug之前(也许是另一个本土的正则表达式解析器?)我问集体智慧:-)

关于hgignore想要去的东西的间接线索的信用

使用负向前瞻性修改.hgignore文件

regex mercurial tortoisehg hgignore regex-lookarounds

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

正则表达式,与or运算符一起理解lookbehind

这更像是一个理解问题,而不是一个实际问题.情况说明如下.我在两个引号""之间得到了一些浮点数(例如金额).

例子:

  1. "1,23"
  2. "12,23"
  3. "123,23"

现在我想在这些表达式中匹配逗号.我构建了以下适用于我的正则表达式:

(?<=\"[0-9]|[0-9]{2})(,)(?=[0-9]{2}\")
Run Code Online (Sandbox Code Playgroud)

我不完全理解的部分是与"或"结合的外观.但是让我们分手吧:

(
?<=             //Start of the lookbehind
\"              //Starting with an escaped quotation mark "
[0-9]           //Followed by a digit between 0 and 9
Run Code Online (Sandbox Code Playgroud)

现在我遇到了问题,在引号后并不总是只有一位数,你可以在例子2和3中看到.范围运算符例如{1,3}在lookbehind中不起作用.正如我在另一个 stackoverflow问题中发现的那样.

所以我决定使用或者"|" 操作员在这里消化:

|[0-9]{2}       //Or followed by two digits between 0 and 9
)
Run Code Online (Sandbox Code Playgroud)

有趣的是它也匹配第三个例子"123,23"中的逗号.我真的不明白为什么.另外我不知道为什么我不必在"|"之后添加起始引号 操作员再次,因为我认为完整的lookbehind直到或运算符将被修改或重复,例如:

(?<=\"[0-9]|\"[0-9]{2})(,)(?=[0-9]{2}\")            //This however does not work at all
Run Code Online (Sandbox Code Playgroud)

所以在我的理解中,匹配所有三个示例的相应正则表达式应如下所示:

(?<=\"[0-9]|\"[0-9]{2}|\"[0-9]{3})(,)(?=[0-9]{2}\")
Run Code Online (Sandbox Code Playgroud)

或至少(如果有人可以解释失踪的""):

(?<=\"[0-9]|[0-9]{2}|[0-9]{3})(,)(?=[0-9]{2}\")
Run Code Online (Sandbox Code Playgroud)

我希望有人能够帮助我了解情况.

//编辑:如果特别感兴趣,我在sublime text 3编辑器的常规文本文件中使用这个正则表达式来搜索逗号并替换它.

regex regex-lookarounds sublimetext3

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

否定完整的正则表达式

强制使用某个 url 结构“类型/名称”,我的工作正则表达式是:

([a-z]+\/?[a-z]+\/?)+
Run Code Online (Sandbox Code Playgroud)

现在我想通过 preg_replace 从字符串中删除所有其他字符,因此否定上面的模式。像 [^az] 这样的简单案例工作正常,但对于我的模式,我无法通过否定整个模式来使其工作。

php regex negation regex-negation regex-lookarounds

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

负向前瞻正则表达式在 Java 中不起作用

以下正则表达式在此处测试时成功运行,但是当我尝试将其实现到我的 Java 代码中时,它不会返回匹配项。它使用负前瞻来确保MAIN LEVEL和之间不会出现换行符Bedrooms。为什么它在 Java 中不起作用?

正则表达式

^\s*\bMAIN LEVEL\b\n(?:(?!\n\n)[\s\S])*\bBedrooms:\s*(.*)

爪哇

pattern = Pattern.compile("^\\s*\\bMAIN LEVEL\\b\\n(?:(?!\\n\\n)[\\s\\S])*\\bBedrooms:\\s*(.*)");
    match = pattern.matcher(content);      
    if(match.find())
    {
        //Doesn't reach here
        String bed = match.group(1);
        bed = bed.trim();
    }
Run Code Online (Sandbox Code Playgroud)

content 只是从文本文件读取的字符串,其中包含上面链接的演示中显示的确切文本。

File file = new File("C:\\Users\\ME\\Desktop\\content.txt"); 
 content = new Scanner(file).useDelimiter("\\Z").next();
Run Code Online (Sandbox Code Playgroud)

更新:

我更改了代码以包含多行修饰符(?m),但它打印出“null”。

pattern = Pattern.compile("(?m)^\\s*\\bMAIN LEVEL\\b\\n(?:(?!\\n\\n)[\\s\\S])*\\bBedrooms:\\s*(.*)");
    match = pattern.matcher(content);
    if(match.find())
    {   // Still not reaching here
        mainBeds=match.group(1);
        mainBeds= mainBeds.trim();
    }
  System.out.println(mainBeds);     // Prints null
Run Code Online (Sandbox Code Playgroud)

java regex pattern-matching regex-lookarounds

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

正则表达式在连字符前后获取文本

我有这个字符串:

"Common Waxbill - Estrilda astrild"
Run Code Online (Sandbox Code Playgroud)

如何为连字符前后的单词编写2个单独的正则表达式?我想要的输出是:

"Common Waxbill" 
Run Code Online (Sandbox Code Playgroud)

"Estrilda astrild"
Run Code Online (Sandbox Code Playgroud)

regex regex-lookarounds

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

在Python中删除字符串中特定子字符串之前和之后的字符

我是Python的新手.可以用regex来完成.我想在字符串中搜索特定的子字符串,并在字符串中删除字符前后的字符.

例1

Input:"This is the consignment no 1234578TP43789"
Output:"This is the consignment no TP"
Run Code Online (Sandbox Code Playgroud)

例2

Input:"Consignment no 1234578TP43789 is on its way on vehicle no 3456MP567890"
Output:"Consignment no TP is on its way on vehicle no MP"
Run Code Online (Sandbox Code Playgroud)

我有要在字符串中搜索的这些首字母缩写词(MP,TP)的列表.

python regex regex-lookarounds

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

正则表达式匹配逗号或字符串

我想将字符匹配到第一个逗号或Esq之后.

Mr. Bob Smith, Esq., Fish Bowl Lane
Mr. Bob Smith, Fish Bowl Lane
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何前瞻以产生所需的效果.

[^,]*
Run Code Online (Sandbox Code Playgroud)

我希望收到

Mr. Bob Smith, Esq.
Run Code Online (Sandbox Code Playgroud)

Mr. Bob Smith
Run Code Online (Sandbox Code Playgroud)

分别.

regex regex-lookarounds

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

RegEx用于在PowerShell中不匹配序列

我想验证一个字符串,当点“。”时正则表达式不匹配。之前或之后直接有“-”或“ _”。

我认为负面的前瞻是最好的方法,但我似乎无法正确地做到这一点。

regex powershell regex-lookarounds

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

使用 javascript 使用正则表达式环视拆分字符串

String.prototype.split如果前一个字符不等于下一个字符,我想用来拆分字符串,这是目标结果:

'abcd' => ['a', 'b', 'c', 'd']

'aaabbbccd' => ['aaa', 'bbb', 'cc', 'd']

我知道可以仅通过以下方式拆分字符串lookbacks

const result = 'aaabbbccd'.split(/(?<=a)/);
console.log(result);  // ["a", "a", "a", "bbbccd"]
Run Code Online (Sandbox Code Playgroud)

所以我想找到一个表达式来找到它的回溯不等于向前看的两个字符的分隔符。

但我试过这个,它不起作用:

const result = 'aaabbcccd'.split(/(?<!\2)(?=.)/);
console.log(result);  // ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd']
Run Code Online (Sandbox Code Playgroud)

那么是否有正则表达式来实现这一目标?或者用正则表达式根本不可能做到这一点?

javascript regex regex-lookarounds

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

如何从单个字符串中提取会话话语

我将几个演讲者之间的对话记录为一个字符串:

convers <- "Peter: hiya Mary: hi how wz your weekend Peter: ahh still got a headache An you party a lot Mary: nuh you know my kid s sick n stuff Peter: yeah i know thats erm al hamshi: hey guys how s it goin Peter: Great Mary: where ve you been last week al hamshi: ah you know camping with my girl friend"
Run Code Online (Sandbox Code Playgroud)

我还有一个演讲者姓名的向量:

speakers <- c("Peter", "Mary", "al hamshi")
Run Code Online (Sandbox Code Playgroud)

使用这个向量作为我的正则表达式模式的一个组成部分,我在这个提取方面做得比较好:

library(stringr)
str_extract_all(convers, 
                paste("(?<=: )[\\w\\s]+(?= ", paste0(".*\\b(", paste(speakers, …
Run Code Online (Sandbox Code Playgroud)

regex r regex-lookarounds

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