ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我想匹配“这是”和“句子”之间的每个字符。应该忽略换行符。我无法弄清楚正确的语法。

您可能想指出您在什么环境中使用正则表达式。根据您所说的“忽略”换行符的确切含义,可能会有所不同。

s
stema

例如

(?<=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 会起作用?
这主要解决了我的问题,但是如何在我的模式中包含空格字符?我尝试了以下操作:“(。*?)())”以匹配序列末尾的“)”,但它不起作用。
只需注意一点 - 正则表达式现在说 javascript 不支持后向
有没有办法处理文本块中这种拆分的重复实例?例如:“这只是一个简单的句子。这里有一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。目前它匹配整个字符串,而不是每个实例。
我会把这个正则表达式纹在我的身上
z
zx81

需要惰性量词

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

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

将匹配 This is my first sentence. This is my second sentence. 中的 my first sentence. This is my second

See demo

您需要两个外观之间的惰性量词。添加 ? 会使星星变得懒惰。

这符合你想要的:

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

See demo。我删除了不需要的捕获组。

跨换行符匹配的 DOTALL 模式

请注意,在演示中设置了“点匹配换行符模式”(又名)点全部(参见 how to turn on DOTALL in various languages)。在许多正则表达式风格中,您可以使用在线修饰符 (?s) 对其进行设置,将表达式转换为:

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

参考

正则表达式贪婪的多种程度

使用 Star 和 Plus 重复


您对捕获组是正确的。不知道我为什么这样做。但是我的回答(“更新”之前的段落)也解释了 .*.*? 之间的区别。所以我不认为我的回答是错误的。
@stema 对吹毛求疵感到抱歉,昨天浏览您的一些答案时,这是唯一让我抽搐的答案。 :) 我将第一行从 is incorrect 软化为 doesn't seem quite correct to me...希望这不会让 抽搐,可能只是对如此高流量的正则表达式的看法不同答案应该是。
W
Wiktor Stribiżew

试试 This is[\s\S]*?sentence,在 javascript 中工作


如何以这种方式执行惰性查找?
@AwQiruiGuo 同上。 [\s\S]*?(也称为:非贪婪通配符)
R
Riyafa Abdul Hameed

这个:

This is (.*?) sentence

在javascript中工作。


我喜欢简单,但这对我来说还不够。我的意思是,"This is just\na simple sentence".match(/This is (.*?) sentence/) 返回了 null"This is just\na simple sentence".match(/This is (.*?) sentence/s) 返回了一个有用的结果。不同之处在于最后一个斜杠后的 DOTALL s
f
fthiella

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


不知道为什么所有的赞成票,这允许0-1换行,并且换行必须紧接在endstringname之前
我发现删除日志行的开头(时间戳等)很有用。我使用新行作为开始字符串,使用“at”作为结束字符串。
R
Roshna Omer

这对我有用(我正在使用 VS Code):

为:This is just\na simple sentence

使用:This .+ sentence


A
AnirbanDebnath

您可以简单地使用它:\This is .*? \sentence


#<Inventory:.*? id: nil, batch_code: 这是我在 vscode 中的最后一个正则表达式,它提取 #<Inventory:0x000055c8a2966b60 id: nil, batch_code: "10324" 并只留下“10324”
A
Alexander Golovinov

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.
}

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


C
Cephos

如果有人在 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)
        }
    }
}

a
alchemy

我在这里搜索正则表达式以在 Python2 中的 print"string" 之间转换此打印语法,在旧脚本中使用: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?


Y
Yahya Hassani

有一种方法可以处理文本块中这种拆分的重复实例吗?例如:“这只是一个简单的句子。这里有一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。要匹配每个实例而不是整个字符串,请使用以下代码:

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())

如果我想在两个连续的之间获取文本怎么办?这只是一个简单的句子。模式?
T
The fourth bird

如果是 JavaScript,您可以使用 [^]match any character including newlines

使用带有点 ./s 标志来匹配任何字符也可以,但适用于整个模式并且 JavaScript 不支持 inline modifiers 来打开/关闭标志。

要匹配尽可能少的字符,您可以通过附加一个问号使量词不贪婪,并使用 capture group 来提取介于两者之间的部分。

This is([^]*?)sentence

请参阅 regex101 demo

附带说明一下,要不匹配部分单词,您可以使用 \bThissentence\b 之类的单词边界

const s = "这只是\n个简单的句子"; const regex = /这是([^]*?)sentence/;常量 m = s.match(正则表达式); if (m) { console.log(m[1]); }

JavaScript 中的环视变体是 (?<=This is)[^]*?(?=sentence),您可以检查 Lookbehind in JS regular expressions 以获得支持。

另见Important Notes About Lookbehind

const s = "这只是\n个简单的句子"; const 正则表达式 = /(?<=This is)[^]*?(?=sentence)/;常量 m = s.match(正则表达式); if (m) { console.log(m[0]); }


S
SherylHohman

我是这样做的:这对我来说比试图找出必要的特定正则表达式更容易。

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

v
vins

要在 VIM 中快速搜索,您可以在 Vim 控制提示符下使用:/This is.*\_.*sentence


C
Community

崇高的文字 3x

在崇高的文本中,您只需写下您有兴趣保留的两个单词,例如在您的情况下它是

“这是”和“句子”

你写 .* 在两者之间

This is .* sentence

这应该对你有好处


不确定问题是关于如何在 Sublime Text 中执行此操作,但主要适用于 Sublime Text。当“This is”和“sentence”之间恰好有换行符时,它不起作用。此外,sublime text 还会选择“This is”和“Sentence”,而不仅仅是这两个字符串之间的文本。