首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从右到左匹配正则表达式?

从右到左匹配正则表达式?
EN

Stack Overflow用户
提问于 2010-06-07 20:50:26
回答 6查看 24.7K关注 0票数 14

有没有办法从右到左匹配正则表达式?我要找的是一个正则表达式,它可以

代码语言:javascript
复制
MODULE WAS INSERTED              EVENT
LOST SIGNAL ON E1/T1 LINK        OFF
CRC ERROR                        EVENT
CLK IS DIFF FROM MASTER CLK SRC  OF

从下面的输入

代码语言:javascript
复制
CLI MUX trap received: (022) CL-B  MCL-2ETH             MODULE WAS INSERTED              EVENT   07-05-2010 12:08:40
CLI MUX trap received: (090) IO-2  ML-1E1        EX1    LOST SIGNAL ON E1/T1 LINK        OFF     04-06-2010 09:58:58
CLI MUX trap received: (094) IO-2  ML-1E1        EX1    CRC ERROR                        EVENT   04-06-2010 09:58:59
CLI MUX trap received: (009)                            CLK IS DIFF FROM MASTER CLK SRC  OFF     07-05-2010 12:07:32

如果我可以完成从右到左的匹配,我可以写下(EVENT|OFF)右边的所有内容,直到第二次出现一个以上的空格+

我今天所做的最好的事情就是用正则表达式获取从(022)到事件的所有内容

代码语言:javascript
复制
CLI MUX trap received: \([0-9]+\)[ ]+(.*[  ]+(EVENT|OFF))

但这并不是我真正想要的:)

编辑:它的语言是什么?它实际上是一个过滤器的配置字符串,但我猜它使用的是标准的GNU C Regex库。

edit2:我喜欢关于按长度剪切的答案,但Amarghosh可能更符合我的要求。我真的不知道为什么我没有想过只削减长度,比如:

代码语言:javascript
复制
^.{56}(.{39}).*$

非常感谢你的快速回答...

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-07 21:09:31

如果保证标记由多个空格分隔,并且保证EVENT|OFF之前的字符串中的单词只由一个空格分隔,则可以查找以单个空格分隔的单词,后跟空格,然后是EVENTOFF

代码语言:javascript
复制
var s = "CLI MUX trap received: (022) CL-B  MCL-2ETH             MODULE WAS INSERTED              EVENT   07-05-2010 12:08:40"
        + "\nCLI MUX trap received: (090) IO-2  ML-1E1        EX1    LOST SIGNAL ON E1/T1 LINK        OFF     04-06-2010 09:58:58"
        + "\nCLI MUX trap received: (094) IO-2  ML-1E1        EX1    CRC ERROR                        EVENT   04-06-2010 09:58:59"
        + "\nCLI MUX trap received: (009)                            CLK IS DIFF FROM MASTER CLK SRC  OFF     07-05-2010 12:07:32"

var r = /\([0-9]+\).+?((?:[^ ]+ )* +(?:EVENT|OFF))/g;
var m;
while((m = r.exec(s)) != null)
  console.log(m[1]);

输出:

代码语言:javascript
复制
MODULE WAS INSERTED              EVENT
LOST SIGNAL ON E1/T1 LINK        OFF
CRC ERROR                        EVENT
CLK IS DIFF FROM MASTER CLK SRC  OFF

正则表达式:/\([0-9]+\).+?((?:[^ ]+ )* +(?:EVENT|OFF))/g

代码语言:javascript
复制
\([0-9]+\)       #digits in parentheses followed by  
.+?              #some characters - minimum required (non-greedy)  
(                #start capturing 
(?:[^ ]+ )*      #non-space characters separated by a space  
` +`             #more spaces (separating string and event/off - 
                 #backticks added for emphasis), followed by
(?:EVENT|OFF)    #EVENT or OFF
)                #stop capturing
票数 2
EN

Stack Overflow用户

发布于 2010-06-07 20:55:44

在.NET中,您可以使用RightToLeft option

代码语言:javascript
复制
Regex RE = new Regex(Pattern, RegexOptions.RightToLeft);
Match theMatch = RE.Match(Source);
票数 20
EN

Stack Overflow用户

发布于 2010-06-07 21:04:20

使用regex,您可以简单地替换以下代码:

代码语言:javascript
复制
^.{56}|.{19}$

使用空字符串。

但实际上,您只需要使用substring函数将字符串从"position 56“剪切到" string -length - 19”。这比正则表达式更容易、更快。

下面是一个用JavaScript编写的例子,其他语言的工作原理大同小异:

代码语言:javascript
复制
var lines = [
  'CLI MUX trap received: (022) CL-B  MCL-2ETH             MODULE WAS INSERTED              EVENT   07-05-2010 12:08:40',
  'CLI MUX trap received: (090) IO-2  ML-1E1        EX1    LOST SIGNAL ON E1/T1 LINK        OFF     04-06-2010 09:58:58',
  'CLI MUX trap received: (094) IO-2  ML-1E1        EX1    CRC ERROR                        EVENT   04-06-2010 09:58:59',
  'CLI MUX trap received: (009)                            CLK IS DIFF FROM MASTER CLK SRC  OFF     07-05-2010 12:07:32'
];
for (var i=0; i<lines.length; i++) {
  alert( lines[i].substring(56, lines[i].length-19) );
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2989606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档