正则表达式匹配两个字符串之间的所有字符
Posted
技术标签:
【中文标题】正则表达式匹配两个字符串之间的所有字符【英文标题】:Regex Match all characters between two strings 【发布时间】:2011-08-31 21:06:46 【问题描述】:示例: “这只是\n个简单的句子”。
我想匹配“This is”和“sentence”之间的每个字符。应该忽略换行符。我不知道正确的语法。
【问题讨论】:
您可能想指出您在什么环境中使用正则表达式。根据您所说的“忽略”换行符的确切含义,可能会有所不同。 【参考方案1】:例如
(?<=This is)(.*)(?=sentence)
Regexr
我使用了lookbehind (?<=)
和lookbehind (?=)
,这样“This is”和“sentence”不包括在匹配中,但这取决于你的用例,你也可以简单地写This is(.*)sentence
。
这里重要的是您激活正则表达式引擎的“dotall”模式,以便.
匹配换行符。但是如何做到这一点取决于您的正则表达式引擎。
接下来是如果您使用.*
或.*?
。第一个是贪婪的,会匹配到字符串中的最后一个“句子”,第二个是惰性的,会匹配到字符串中的下一个“句子”。
更新
Regexr
This is(?s)(.*)sentence
(?s) 在哪里打开 dotall 修饰符,使 .
匹配换行符。
更新 2:
(?<=is \()(.*?)(?=\s*\))
与您的示例“这是(一个简单的)句子”相匹配。请参阅此处Regexr
【讨论】:
@tchrist,对不起,我不得不查一下。我是否理解正确并且This is(?s)(.*)sentence
会起作用?
@stema:是的,这应该可以在大多数正则表达式库下启用“全点”模式。
这主要解决了我的问题,但是如何在我的模式中包含空格字符?我尝试了以下方法:"(.*?)( ))" 以匹配序列末尾的 ")",但它不起作用。
只有一个注释 - 正则表达式现在说 javascript 不支持后视
有没有办法处理文本块中这种拆分的重复实例?例如:“这只是一个简单的句子。这是一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。目前它匹配整个字符串,而不是每个实例。【参考方案2】:
需要惰性量词
重新提出这个问题,因为接受答案中的正则表达式对我来说似乎不太正确。为什么?因为
(?<=This is)(.*)(?=sentence)
将匹配my first sentence. This is my second
中的This is my first sentence. This is my second sentence.
See demo。
您需要在两个lookarounds 之间添加一个惰性量词。添加?
会使明星变得懒惰。
这符合您的要求:
(?<=This is).*?(?=sentence)
See demo。我删除了不需要的捕获组。
DOTALL 模式以匹配换行符
请注意,在演示中设置了“点匹配换行模式”(又名)点全部(参见how to turn on DOTALL in various languages)。在许多正则表达式风格中,您可以使用在线修饰符 (?s)
对其进行设置,将表达式变为:
(?s)(?<=This is).*?(?=sentence)
参考
The Many Degrees of Regex Greed Repetition with Star and Plus【讨论】:
您对捕获组是正确的。不知道我为什么这样做。但是.*
和.*?
之间的区别也在我的回答(“更新”之前的段落)中进行了解释。所以我不认为我的回答是错误的。
@stema 对吹毛求疵感到抱歉,昨天浏览您的一些答案时,这是唯一让我抽搐的答案。 :) 我将第一行从 is incorrect
软化为 doesn't seem quite correct to me
... 希望这不会让 你 抽搐,可能只是对如此高流量的正则表达式的看法不同答案应该是。【参考方案3】:
试试This is[\s\S]*?sentence
,在javascript中工作
【讨论】:
这种方式如何进行惰性查找? @AwQiruiGuo 同上。[\s\S]*?
(也称为:非贪婪通配符)【参考方案4】:
这个:
This is (.*?) sentence
在 javascript 中工作。
【讨论】:
【参考方案5】:使用这个:(?<=beginningstringname)(.*\n?)(?=endstringname)
【讨论】:
不知道为什么所有的赞成票,这允许0-1换行,并且换行必须紧接在endstringname
之前
我发现删除日志行的开头(时间戳等)很有用。我使用新行作为开始字符串,使用“at”作为结束字符串。【参考方案6】:
这对我有用(我正在使用 VS Code):
对于:
This is just\na simple sentence
使用:
This .+ sentence
【讨论】:
正是我想要的!谢谢! 这比其他解决方案更具可读性和易记性【参考方案7】:如果有人在 Jenkins 上下文中寻找这样的例子。它解析 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)
【讨论】:
【参考方案8】: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.
此示例将仅包含 “将保存” 字词,但在较大的文本中可能会找到更多匹配项。
【讨论】:
【参考方案9】:你可以简单地使用这个:\This is .*? \sentence
【讨论】:
【参考方案10】:我在这里搜索 regex 以在 print"string" 之间转换此打印语法,在 Python2 中的旧脚本中使用:print("string"),对于 Python3。效果很好,否则使用 2to3.py 进行额外的转换。这是我对其他人的解决方案:
在 Regexr.com 上试用(由于某种原因在 NP++ 中不起作用):
find: (?<=print)( ')(.*)(')
replace: ('$2')
对于变量:
(?<=print)( )(.*)(\n)
('$2')\n
对于标签和变量:
(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n
How to replace all print "string" in Python2 with print("string") for Python3?
【讨论】:
【参考方案11】:有一种方法可以处理文本块中这种拆分的重复实例吗?例如:“这只是一个简单的句子。这是一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。要匹配每个实例而不是整个字符串,请使用以下代码:
data = "This is just\na simple sentence. Here is some additional stuff. This is just\na simple sentence. And here is some more stuff. This is just\na simple sentence."
pattern = re.compile('This is (?s).*? sentence')
for match_instance in re.finditer(pattern, data):
do_something(match_instance.group())
【讨论】:
如果我想在两个连续的之间获取文本怎么办?这只是\n个简单的句子。模式?【参考方案12】:我是这样做的: 这对我来说比试图找出必要的特定正则表达式更容易。
int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); `
【讨论】:
【参考方案13】:要在 VIM 中快速搜索,您可以使用 在 Vim 控制提示符下:/This is.*\_.*sentence
【讨论】:
【参考方案14】:崇高文本 3x
在崇高的文本中,您只需写下您感兴趣的两个单词,例如在您的情况下它是
“这是”和“句子”
你在两者之间写.*
即This is .* sentence
这应该对你有好处
【讨论】:
不确定问题是关于如何在 Sublime Text 中执行此操作,但主要适用于 Sublime Text。当“This is”和“sentence”之间恰好有换行符时,它不起作用。此外,sublime text 还会选择“This is”和“Sentence”,而不仅仅是在这两个字符串之间的文本。以上是关于正则表达式匹配两个字符串之间的所有字符的主要内容,如果未能解决你的问题,请参考以下文章