正则表达式匹配两个字符串之间的所有字符


434

示例:“这只是一个简单的句子”。

我想匹配“这是”和“句子”之间的每个字符。换行符应忽略。我找不到正确的语法。


11
您可能要指出正在使用Regex的环境。根据“忽略”换行符的确切含义,可能会有差异。
安德鲁·巴伯

Answers:


646

例如

(?<=This is)(.*)(?=sentence)

正则表达式

我使用了向后看(?<=)和向前看,(?=)以便在匹配中不包括“这是”和“句子”,但这取决于您的用例,您也可以简单地编写This is(.*)sentence

这里重要的是要激活正则表达式引擎的“ dotall”模式,以使.匹配换行符。但是,如何执行此操作取决于您的正则表达式引擎。

接下来是如果您使用.*.*?。第一个是贪婪的,将匹配到字符串中的最后一个“句子”,第二个是懒惰的,将匹配到字符串中的下一个“句子”。

更新资料

正则表达式

This is(?s)(.*)sentence

(?s)打开dotall修饰符的位置,使之.与换行符匹配。

更新2:

(?<=is \()(.*?)(?=\s*\))

与您的示例“这是(一个简单的)句子”匹配。在Regexr上看到这里


@tchrist,对不起,我必须查一下。我知道这个正确,This is(?s)(.*)sentence并且可以正常工作吗?
斯玛

@stema:是的,应该可以在大多数正则表达式库下启用“点全部”模式。
tchrist 2011年

1
大部分解决了我的问题,但是如何在样式中包含空格字符?我尝试了以下操作:“(。*?)())”匹配序列末尾的“)”,但是没有用。
2011年

28
仅需注意一下-regexr说,JavaScript不支持
lookbehind

2
有没有办法在一块文本中处理该拆分的重复实例?实例:“这只是一个简单的句子。这是一些其他内容。这是一个简单的句子。这是更多的东西。这是一个简单的句子。” 当前,它匹配整个字符串,而不是每个实例。
jzadra

181

需要惰性量词

重新提出这个问题,因为接受的答案中的正则表达式对我而言似乎不太正确。为什么?因为

(?<=This is)(.*)(?=sentence)

将匹配my first sentence. This is my secondThis is my first sentence. This is my second sentence.

参见演示

您需要在两种环视之间使用惰性的量词。添加a ?使星星变懒。

这符合您的要求:

(?<=This is).*?(?=sentence)

参见演示。我删除了捕获组,这不是必需的。

DOTALL模式以匹配整个换行符

请注意,在演示中,设置了“点匹配换行模式”(又名:dot-all)(请参阅如何以各种语言打开DOTALL)。在许多正则表达式中,您可以使用online修饰符进行设置(?s),将表达式转换为:

(?s)(?<=This is).*?(?=sentence)

参考


您对捕获组是正确的。不知道为什么我要这么做。但是,我.*.*?我的答案(“更新”之前的段落)也说明了和之间的区别。因此,我认为我的答案不正确。
斯玛2014年

2
@stema对不起,您昨天在浏览您的一些答案时,这是唯一让我抽搐的答案。:)我把第一行从缓和is incorrectdoesn't seem quite correct to me...希望这不会使抽搐,可能只是对这种高流量答案的正则表达式的理解有所不同。
zx81 2014年

39

试试看This is[\s\S]*sentence,可以在javascript中使用


如何以这种方式执行延迟查找?
AGamePlayer

4
@AwQiruiGuo与上述相同。[\s\S]*?(也称为:非贪婪通配符)
phil294


13

用这个: (?<=beginningstringname)(.*\n?)(?=endstringname)


不知道为什么所有人都投票赞成,这允许0-1换行,而换行必须在紧接之前endstringname
OGHaza

我发现删除日志行的开头(时间戳等)很有用。我使用新行作为开始字符串,并使用“ at”作为结束字符串。
斯坦(Stan)

2

如果有人在詹金斯语境中寻找这样的例子。它解析build.log,如果找到匹配项,则通过匹配项使构建失败。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}


0

崇高文字3x

在崇高的文字中,您只需写下您有兴趣保留的两个词,例如

“这是”和“句子”

然后在两者之间写。*

This is .* sentence

这应该对你有好处


不确定问题是关于如何在Sublime Text中执行此操作的,但是大多数情况下在Sublime Text中有效。当“ This is”和“ Sentence”之间出现换行符时,它将不起作用。此外,崇高文字还会选择“这是”和“句子”,而不是仅选择这两个字符串之间的文字。
Dylan Kinnett

0

这是我的操作方法:
对我而言,这比尝试找出必要的特定正则表达式要容易得多。

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

0

要在VIM中进行快速搜索,可以在Vim Control提示符下使用:/This.*\_.*sentence


0

我在这里搜索正则表达式,以便在Python2中的旧脚本中使用print(“ string”)对于Python3在print“ string”之间转换此打印语法。效果很好,否则请使用2to3.py进行其他转换。这是我为他人准备的解决方案:

在Regexr.com上尝试一下(由于某些原因在NP ++中不起作用):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

对于变量:

(?<=print)( )(.*)(\n)
('$2')\n

对于标签和变量:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

如何用Python3的print(“ string”)替换Python2中的所有print“ string”?



0

RegEx使用Java方法匹配两个字符串之间的所有内容。

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

让我们使用Pattern和Matcher对象来使用RegEx (。?)*

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

由于Matcher可能包含多个匹配项,因此我们需要遍历结果并将其存储。

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

此示例将仅包含“将保存”一词,但是在较大的文本中,它将可能找到更多匹配项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.