我知道这个问题以前曾被问过,但我无法获得我一直在寻找的答案。我有一个包含数千行的JSON文件,并希望每次出现时在两个字符串之间简单地提取文本(很多)。
作为一个简单的示例,我的JSON如下所示:
"customfield_11300": null,
"customfield_11301": [
{
"self": "xxxxxxxx",
"value": "xxxxxxxxx",
"id": "10467"
}
],
"customfield_10730": null,
"customfield_11302": null,
"customfield_10720": 0.0,
"customfield_11300": null,
"customfield_11301": [
{
"self": "zzzzzzzzzzzzz",
"value": "zzzzzzzzzzz",
"id": "10467"
}
],
"customfield_10730": null,
"customfield_11302": null,
"customfield_10720": 0.0,
Run Code Online (Sandbox Code Playgroud)
所以我想输出“ customfield_11301”和“ customfield_10730”之间的所有内容:
{
"self": "xxxxxxxx",
"value": "xxxxxxxxx",
"id": "10467"
}
],
{
"self": "zzzzzzzzzzzzz",
"value": "zzzzzzzzzzz",
"id": "10467"
}
],
Run Code Online (Sandbox Code Playgroud)
我正在尝试使其尽可能简单-所以不在乎括号是否显示在输出中。
这就是我所拥有的(输出的方式比我想要的还要多):
$importPath = "todays_changes.txt"
$pattern = "customfield_11301(.*)customfield_10730"
$string = Get-Content $importPath
$result = [regex]::match($string, $pattern).Groups[1].Value
$result
Run Code Online (Sandbox Code Playgroud)
小智 6
这是一个 PowerShell 函数,它将在两个字符串之间找到一个字符串。
function GetStringBetweenTwoStrings($firstString, $secondString, $importPath){
#Get content from file
$file = Get-Content $importPath
#Regex pattern to compare two strings
$pattern = "$firstString(.*?)$secondString"
#Perform the opperation
$result = [regex]::Match($file,$pattern).Groups[1].Value
#Return result
return $result
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样运行该函数:
GetStringBetweenTwoStrings -firstString "Lorem" -secondString "is" -importPath "C:\Temp\test.txt"
Run Code Online (Sandbox Code Playgroud)
我的 test.txt 文件中包含以下文本:
Lorem Ipsum 只是印刷和排版行业的虚拟文本。
所以我的结果:
益生元
您需要使您的 RegEx Lazy:
customfield_11301(.*?)customfield_10730
Run Code Online (Sandbox Code Playgroud)
你的正则表达式是贪婪的。这意味着它将找到customfield_11301并继续传送,直到找到最后一个 customfield_10730。
这是贪婪与惰性正则表达式的一个更简单的示例:
# Regex (Greedy): [(.*)]
# Input: [foo]and[bar]
# Output: foo]and[bar
# Regex (Lazy): [(.*?)]
# Input: [foo]and[bar]
# Output: "foo" and "bar" separately
Run Code Online (Sandbox Code Playgroud)
您的正则表达式与第一个正则表达式非常相似,它捕获了太多数据,而这个新正则表达式捕获了尽可能少的数据,因此将按您的预期工作
快速的答案是-将您的贪婪捕获(.*)更改为非贪婪- (.*?)。那应该做。
customfield_11301(.*?)customfield_10730
Run Code Online (Sandbox Code Playgroud)
否则,捕获会吃掉尽可能多的东西,导致捕获持续到最后customfield_10730。
问候