我试图从下面的字符串中捕获主题,但使用正则表达式从匹配结果中排除rn
。字符串:
Sep 20 02:00:00 127.0.0.1 TestHost: Info: MID 123456 Subject "[Notification] - System 1234 [hostname] -rn SERVICE_STARTED (INFO)"
预期输出应为(不包括rn
(
[Notification] - System 1234 [hostname] - SERVICE_STARTED (INFO)
我尝试在regex101 中使用以下regex
Subject ['"]?(?<subject>((?:\r\n)?.*))['"]?$
但这并没有给我带来正确的结果。
请注意,我没有;我没有使用replace/sub的选项,因为我必须这样做。
Splunk当然有替换字符串中值的方法——要么在sed
模式中使用rex
,要么使用eval replace()
这个正则表达式将提取您要查找的内容:
| rex field=_raw ""(?<subject>[^"]+)"
随后更换rn
:
| eval subject=replace(subject,"[rn]+","")
如果replace
对您不起作用(有时这些隐藏字符会显示为连续的空白(,请执行以下操作:
| eval subject=replace(subject,"ss+"," ")
试试这个:
const str = 'Sep 20 02:00:00 127.0.0.1 TestHost: Info: MID 123456 Subject "[Notification] - System 1234 [hostname] -rn SERVICE_STARTED (INFO)"';
console.log(str.match(/[^('")]*.*[('")$]/g)[1].replace(/[rn'"]/g, ''));
RegEx解释:
[^('")]
:匹配以单引号或双引号开头的字符串。
*.*
:匹配启动后的任意字符数
[('")$]
:用于匹配末尾的单引号或双引号。
如上所述,regex将匹配给定字符串中的两个子字符串,我们将获取第二个子字符串,然后使用String.replace()
方法替换rn
。