Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 条件正则表达式是否可以用于匹配字符串不同位置的一个字段,这取决于它在字符串早期找到的内容?_Regex_Conditional - Fatal编程技术网

Regex 条件正则表达式是否可以用于匹配字符串不同位置的一个字段,这取决于它在字符串早期找到的内容?

Regex 条件正则表达式是否可以用于匹配字符串不同位置的一个字段,这取决于它在字符串早期找到的内容?,regex,conditional,Regex,Conditional,假设我有一个字符串,可以是以下形式: asdf - 10.0.0.1 [stuff] [xRelevantStuffx] asdf [yRelevantStuffy] 10.0.0.1 [stuff] [xRelevantStuffx] 基本上,在上面的场景中,我想做的是有4个不同的组,其中一个组将在每个场景中匹配以下内容: 第1组:asdf 第3组:10.0.0.1 第四组:stuff 但对于第2组,我希望它有所不同,这取决于hypen-角色是否提前出现。如果它确实出现,我想让第2组匹

假设我有一个字符串,可以是以下形式:

asdf - 10.0.0.1 [stuff] [xRelevantStuffx]

asdf [yRelevantStuffy] 10.0.0.1 [stuff] [xRelevantStuffx]
基本上,在上面的场景中,我想做的是有4个不同的组,其中一个组将在每个场景中匹配以下内容:

  • 第1组:
    asdf
  • 第3组:
    10.0.0.1
  • 第四组:
    stuff
但对于第2组,我希望它有所不同,这取决于hypen
-
角色是否提前出现。如果它确实出现,我想让第2组匹配
xRelevantStuffx
。但是,如果它是非连字符值,我不关心字符串后面的内容,我希望它与
yrelevatntstuffy
匹配


正则表达式是否具有足够的条件匹配功能,以便我完全通过正则表达式来完成这项工作,或者我是否打算尝试在这里找到一个利用外部字符串操作/逻辑的不同解决方案?

您可以做的是在一个内部捕获,并使连字符到最后一个括号的部分成为可选部分。前瞻是一个零长度断言,允许在放置它的位置执行操作

^(\w+) (?=(?:-.*)?\[([^]]+)\]).*? ((?:\d+\.){3}\d+) \[([^]]+)\]
(将
*
附加到图案上)


如果您需要更多的组,但交替使用相同的组索引,另一个想法是在一个内部捕获,其中捕获组备选方案共享相同的组索引

^(\w+) (?=(?|-.*\[([^]]+)\]|\[([^]]+)\])).*? ((?:\d+\.){3}\d+) \[([^]]+)\]
(PCRE和JGsoft V2中提供分支重置)



此外,至少在PCRE中有可用的
J
(PCRE\u DUPNAMES),它允许子模式使用重复的名称。我不知道这些想法中哪一个最适合您的环境。

只需为所有内容设置捕获组,然后选择要保留在应用程序逻辑中的内容。通常我会这样做,但是,这适用于splunk transformation.conf edit,它基本上只需要一个regex语句来执行字段转换。我可能还有其他的解决办法,但我希望通过一些花哨的lookaheads或lookbehinds,这可能是我可以使用的东西?问题是我在网上找到的所有教程似乎并没有以我期待的方式使用它们,但感觉可能是可能的?组号总是从左到右计数。我不确定是否有任何方法可以让第二组有时与第三组和第四组的右侧匹配。你太棒了,谢谢你,这正是我要找的!