示例:“这只是一个简单的句子”。
我想匹配“这是”和“句子”之间的每个字符。应该忽略换行符。我无法弄清楚正确的语法。
例如
(?<=This is)(.*)(?=sentence)
我使用了lookbehind (?<=)
和lookbehind (?=)
,所以“This is”和“sentence”不包含在匹配中,但这取决于您的用例,您也可以简单地编写This is(.*)sentence
。
这里重要的是您激活正则表达式引擎的“dotall”模式,以便 .
匹配换行符。但是你如何做到这一点取决于你的正则表达式引擎。
接下来是使用 .*
或 .*?
。第一个是贪婪的,将匹配到字符串中的最后一个“句子”,第二个是惰性的,将匹配到字符串中的下一个“句子”。
更新
This is(?s)(.*)sentence
其中 (?s) 打开 dotall 修饰符,使 .
匹配换行符。
更新 2:
(?<=is \()(.*?)(?=\s*\))
与您的示例“这是(一个简单的)句子”相匹配。请参阅 Regexr 上的此处
需要惰性量词
重新提出这个问题,因为接受答案中的正则表达式对我来说似乎不太正确。为什么?因为
(?<=This is)(.*)(?=sentence)
将匹配 This is my first sentence. This is my second sentence.
中的 my first sentence. This is my second
您需要两个外观之间的惰性量词。添加 ?
会使星星变得懒惰。
这符合你想要的:
(?<=This is).*?(?=sentence)
See demo。我删除了不需要的捕获组。
跨换行符匹配的 DOTALL 模式
请注意,在演示中设置了“点匹配换行符模式”(又名)点全部(参见 how to turn on DOTALL in various languages)。在许多正则表达式风格中,您可以使用在线修饰符 (?s)
对其进行设置,将表达式转换为:
(?s)(?<=This is).*?(?=sentence)
参考
正则表达式贪婪的多种程度
使用 Star 和 Plus 重复
.*
和 .*?
之间的区别。所以我不认为我的回答是错误的。
is incorrect
软化为 doesn't seem quite correct to me
...希望这不会让 你 抽搐,可能只是对如此高流量的正则表达式的看法不同答案应该是。
试试 This is[\s\S]*?sentence
,在 javascript 中工作
[\s\S]*?
(也称为:非贪婪通配符)
这个:
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
。
使用这个:(?<=beginningstringname)(.*\n?)(?=endstringname)
endstringname
之前
这对我有用(我正在使用 VS Code):
为:This is just\na simple sentence
使用:This .+ sentence
您可以简单地使用它:\This is .*? \sentence
#<Inventory:.*? id: nil, batch_code:
这是我在 vscode 中的最后一个正则表达式,它提取 #<Inventory:0x000055c8a2966b60 id: nil, batch_code: "10324"
并只留下“10324”
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.
}
此示例将仅包含“将保存”一词,但在较大的文本中可能会找到更多匹配项。
如果有人在 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)
}
}
}
我在这里搜索正则表达式以在 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?
有一种方法可以处理文本块中这种拆分的重复实例吗?例如:“这只是一个简单的句子。这里有一些额外的东西。这只是一个简单的句子。这里还有一些东西。这只是一个简单的句子。”。要匹配每个实例而不是整个字符串,请使用以下代码:
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())
如果是 JavaScript,您可以使用 [^]
到 match any character including newlines。
使用带有点 .
的 /s
标志来匹配任何字符也可以,但适用于整个模式并且 JavaScript 不支持 inline modifiers 来打开/关闭标志。
要匹配尽可能少的字符,您可以通过附加一个问号使量词不贪婪,并使用 capture group 来提取介于两者之间的部分。
This is([^]*?)sentence
请参阅 regex101 demo。
附带说明一下,要不匹配部分单词,您可以使用 \bThis
和 sentence\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]); }
我是这样做的:这对我来说比试图找出必要的特定正则表达式更容易。
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
崇高的文字 3x
在崇高的文本中,您只需写下您有兴趣保留的两个单词,例如在您的情况下它是
“这是”和“句子”
你写 .* 在两者之间
即This is .* sentence
这应该对你有好处
不定期副业成功案例分享
This is(?s)(.*)sentence
会起作用?