【问题标题】:Parsing an input-string with different quotes via RegEx通过 RegEx 解析具有不同引号的输入字符串
【发布时间】:2021-10-27 14:22:31
【问题描述】:

我需要通过 Powershell 将包含多个单词的输入字符串转换为字符串数组。 单词可以由多个空格和/或换行符分隔。 每个单词都可以用单引号或双引号转义。 有些词可能以标签开头 - 在这种情况下,任何引用都会出现在该标签之后。

这里是一个可能的输入和预期结果的代码示例:

$inputString = @"
  test1
  #custom1
  #"custom2"           #'custom3'
  #"custom ""four"""   #'custom ''five'''
  test2 "test3" 'test4'
"@

$result = @(
    'test1'
    '#custom1'
    '"#custom2"'
    "#'custom3'"
    '#"custom ""four"""'   
    "#'custom ''five'''"
    'test2' 
    '"test3"' 
    "'test4'"
)

有没有办法通过聪明的正则表达式来做到这一点?或者有人有一个 parser-sn-p/function 开始?

【问题讨论】:

  • 用正则表达式处理''/"" 转义序列将是一场噩梦,你最好手动编写解析器(一次读取一个字符的字符串,然后决定它是否是前一个令牌的延续)
  • 感谢您的快速反馈。会不会误用 convertFrom-CSV servlet?
  • 不,它会期望分隔符是统一的,它将以# 开头的任何内容解释为注释/元数据。您需要自己编写
  • 主题标签是否允许出现在字符串中?如果没有,替换它们会使这项任务变得容易得多。

标签: regex powershell parsing


【解决方案1】:

假设您完全控制或隐式信任输入字符串,您可以使用以下方法,它依赖于Invoke-Expression,其中should normally be avoided

假设

  • # 只出现在嵌入字符串的开始处。
  • 没有嵌入的字符串本身包含换行符。
$inputString = @"
  test1
  #custom1
  #"custom2"           #'custom3'
  #"custom ""four"""   #'custom ''five'''
  test2 "test3" 'test4'
"@

$embeddedStrings = Invoke-Expression @"
Write-Output $($inputString -replace '\r?\n', ' ' -replace '#', '`#')
"@

警告:外部在各个字符串周围的引用在处理过程中丢失,而嵌入、转义引号未转义;输出$embeddedString 产量:

test1
#custom1
#custom2
#custom3
#custom "four"
#custom 'five'
test2
test3
test4

该方法依赖于您的嵌入式字符串使用 PowerShell 的引用和引用转义规则这一事实;唯一的问题是前面的# 字符,它们在上面被转义为`#。 通过用空格替换嵌入的换行符(\r?\n),结果可以作为位置参数列表传递给Write-Output,在一个字符串中,然后用Invoke-Expression评估,这使得Write-Output输出解析的参数一个接一个,捕获为变量$embeddedStrings中的数组。

【讨论】:

  • 假设在给定的场景中得到满足。
  • 至于否决的问题,@Carsten:我认为一些用户对提问者缺乏努力感到不满。对我来说,虽然作为问题的一部分尝试解决方案会有所帮助,但这不是必需的,只要问题对问题有明确的描述即可。
  • 我同意,一个问题得到一个负分是很糟糕的。我认为根本原因是,对于 RegEx,您无法在此处创建示例代码-sn-p。要么成功,要么失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多