Powershell提取两个字符串之间的文本

adj*_*uzy 4 regex powershell

我知道这个问题以前曾被问过,但我无法获得我一直在寻找的答案。我有一个包含数千行的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 只是印刷和排版行业的虚拟文本。

所以我的结果:

益生元


Kas*_*Lee 5

您需要使您的 RegEx Lazy

customfield_11301(.*?)customfield_10730
Run Code Online (Sandbox Code Playgroud)

Live Demo on Regex101

你的正则表达式是贪婪的。这意味着它将找到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)

您的正则表达式与第一个正则表达式非常相似,它捕获了太多数据,而这个新正则表达式捕获了尽可能少的数据,因此将按您的预期工作


Sam*_*han 5

快速的答案是-将您的贪婪捕获(.*)更改为非贪婪- (.*?)。那应该做。

customfield_11301(.*?)customfield_10730
Run Code Online (Sandbox Code Playgroud)

否则,捕获会吃掉尽可能多的东西,导致捕获持续到最后customfield_10730

问候