【发布时间】:2011-08-31 21:06:46
【问题描述】:
示例: “这只是\n个简单的句子”。
我想匹配“This is”和“sentence”之间的每个字符。应该忽略换行符。我不知道正确的语法。
【问题讨论】:
-
您可能想指出您在什么环境中使用正则表达式。根据您所说的“忽略”换行符的确切含义,可能会有所不同。
标签: regex
示例: “这只是\n个简单的句子”。
我想匹配“This is”和“sentence”之间的每个字符。应该忽略换行符。我不知道正确的语法。
【问题讨论】:
标签: regex
例如
(?<=This is)(.*)(?=sentence)
我使用了lookbehind (?<=)和lookbehind (?=),这样“This is”和“sentence”不包括在匹配中,但这取决于你的用例,你也可以简单地写This is(.*)sentence。
这里重要的是您激活正则表达式引擎的“dotall”模式,以便. 匹配换行符。但是如何做到这一点取决于您的正则表达式引擎。
接下来是如果您使用.* 或.*?。第一个是贪婪的,会匹配到字符串中的最后一个“句子”,第二个是惰性的,会匹配到字符串中的下一个“句子”。
更新
This is(?s)(.*)sentence
(?s) 在哪里打开 dotall 修饰符,使 . 匹配换行符。
更新 2:
(?<=is \()(.*?)(?=\s*\))
与您的示例“这是(一个简单的)句子”相匹配。请参阅此处Regexr
【讨论】:
This is(?s)(.*)sentence 会起作用?
重新提出这个问题,因为接受答案中的正则表达式对我来说似乎不太正确。为什么?因为
(?<=This is)(.*)(?=sentence)
将匹配my first sentence. This is my second 中的This is my first sentence. This is my second sentence.
您需要在两个lookarounds 之间添加一个惰性量词。添加? 会使明星变得懒惰。
这符合您的要求:
(?<=This is).*?(?=sentence)
See demo。我删除了不需要的捕获组。
DOTALL 模式以匹配换行符
请注意,在演示中设置了“点匹配换行模式”(又名)点全部(参见how to turn on DOTALL in various languages)。在许多正则表达式风格中,您可以使用在线修饰符 (?s) 对其进行设置,将表达式变为:
(?s)(?<=This is).*?(?=sentence)
参考
【讨论】:
.* 和.*? 之间的区别也在我的回答(“更新”之前的段落)中进行了解释。所以我不认为我的回答是错误的。
is incorrect 软化为 doesn't seem quite correct to me... 希望这不会让 你 抽搐,可能只是对如此高流量的正则表达式的看法不同答案应该是。
试试This is[\s\S]*?sentence,在javascript中工作
【讨论】:
[\s\S]*?(也称为:非贪婪通配符)
这个:
This is (.*?) sentence
在 javascript 中工作。
【讨论】:
使用这个:(?<=beginningstringname)(.*\n?)(?=endstringname)
【讨论】:
endstringname之前
这对我有用(我正在使用 VS Code):
对于:
This is just\na simple sentence
使用:
This .+ sentence
【讨论】:
如果有人在 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)
}
}
}
【讨论】:
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.
}
此示例将仅包含 “将保存” 字词,但在较大的文本中可能会找到更多匹配项。
【讨论】:
你可以简单地使用这个:\This is .*? \sentence
【讨论】:
我在这里搜索 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?
【讨论】:
有一种方法可以处理文本块中这种拆分的重复实例吗?例如:“这只是一个简单的句子。这是一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。要匹配每个实例而不是整个字符串,请使用以下代码:
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())
【讨论】:
我是这样做的:
这对我来说比试图找出必要的特定正则表达式更容易。
int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); `
【讨论】:
要在 VIM 中快速搜索,您可以使用 在 Vim 控制提示符下:/This is.*\_.*sentence
【讨论】:
在崇高的文本中,您只需写下您感兴趣的两个单词,例如在您的情况下它是
“这是”和“句子”
你在两者之间写.*
即This is .* sentence
这应该对你有好处
【讨论】: