无论我多么认为我知道正则表达式,他们似乎总是打败我.
我正在寻找一个匹配任何字符串的通用模式.我可以弄清楚如何处理所有这些不同的命名约定的唯一方法是制作一堆不同的正则表达式模式,现在我甚至不确定是否所有数据都被拾取,所以我必须手动交叉检查它.
我只想尝试可能在两个括号[]内的任何东西:
elseif($line -match "\[\w*\d*\]") {
$pars = $matches[0]
}
elseif($line -match "\[\d*\w*\]") {
$pars = $matches[0]
}
elseif($line -match "\[\w*\d*_\w*\]") {
$pars = $matches[0]
}
elseif($line -match "\[\w*\d*_*\w*-*\w*:*\w*\]") {
$pars = $matches[0]
}
elseif($line -match "\[\w*_*\w*_*\w*_*\w*_*\w*_*\w*-*\w*\]") {
$pars = $matches[0]
}
Run Code Online (Sandbox Code Playgroud)
我这样做的方式不会产生错误,但我不确定它是否处理了我可能遇到的所有情况.这么多数据几乎不可能手动检查.
此外,如果有人知道生成正则表达式模式的一个很好的实用程序,将非常感激.我只能找到对我来说不是很有用的正则表达式测试程序,而且对于使用PowerShell的正则表达式,在线帮助很少.
我正在检索WMI win32_process信息并尝试将CreationDate转换为更具可读性的东西
$Header = @("__SERVER","Caption","CommandLine","CreationDate","ProcessID")
$processes = Get-WmiObject win32_process -ComputerName theComputer |? {$_.caption -eq "java.exe"} | select $header
#Format-Date
$processes | % {
$crdate = $_.CreationDate
if($crdate -match ".\d*-\d*") {
$crdate = $crdate -replace $matches[0]," "
$idate = [System.Int64]$crdate
$date = [DateTime]::ParseExact($idate,'yyyyMMddhhmmss',$null)
$_.CreationDate = $date
}
}
Run Code Online (Sandbox Code Playgroud)
此功能很有用,但有时会失败并显示错误消息:
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
我知道我正在传入一个int,我也试过转换$idate
为一个String并传入它,但它在相同的值上出错了.
样本输入:(在ParseExact调用之前的$
idate 值)20130719113954
20130719114700
20130719133000 <----此失败
20130719053000
20130719060001
20130719134000 <----此失败
很明显,此功能仅在12:00之前有效
我的问题是如何让这个来识别军事时间?在12岁之前,它会让我看起来像一个伟大的约会7/19/2013 11:47:00 AM …