Ruby 正则表达式选择没有 [

标签 ruby regex

我需要在我的日志 (meassage1) 中选择没有 [ 的字母。

我的日志:

 [LogMessage:INFO:[sm-Server-02110] Product=PolicyServer,Platform=Linux 2.6.32-573.8.1.el6.x86_64,Version=12.52,Update=01.01,Label=640,Crypto=128,UTC=1456285048,TZ=0][]

我的正则表达式:

 \[(?<message1>\S+)\]\s(?<message2>.*)\]\[(?<data>[^\]]*)\]$

匹配:

message1    LogMessage:INFO:[sm-Server-02110
message2    Product=PolicyServer,Platform=Linux    2.6.32-573.8.1.el6.x86_64,Version=12.52,Update=01.01,Label=640,Crypto=128,UTC=1456285048,TZ=0
data

引用: http://rubular.com/r/urCvQMdRlB

我需要匹配结果 message1 LogMessage:INFO:sm-Server-02110 而不是 message1 LogMessage:INFO:[sm-Server-02110

我尝试了以下方式:

\[(?<message1>[^[].*)\]\s(?<message2>.*)\]\[(?<data>[^\]]*)\]$

但是它抛出 char-class 过早结束。

建议我如何在不选择这个的情况下选择值。

最佳答案

下面的答案是根据 Wiktor Stribiżew 的要求在评论中发布的。

无法将文本的非连续部分捕获到一组中。因此,我们有两种不同的可能性:

1.(Wiktor Stribiżew):

input = "[LogMessage:INFO:[sm-Server-02110] Product=Policy"
input =~ /^\[(?<message1>\S+)\]\s(?<message2>.*)$/
[$~[:message1].delete('['), $~[:message2]]
#⇒ [
#    [0] "LogMessage:INFO:sm-Server-02110",
#    [1] "Product=Policy"
# ]

2.(通过 mudasobwa):

input =~ /^\[(?<message1_1>.+?)\[(?<message1_2>.+?)\]\s(?<message2>.*)$/
[$~[:message1_1] + $~[:message1_2], $~[:message2]]
#⇒ [
#    [0] "LogMessage:INFO:sm-Server-02110",
#    [1] "Product=Policy"
# ]

关于Ruby 正则表达式选择没有 [,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44669016/

相关文章:

Ruby Hash 破坏性与非破坏性方法

php - 找到 [abc] 而不是 [;;abc] 的正则表达式

Python - 用于从文本中获取特定行的正则表达式

ruby - 无法安装logtash contrib插件?

ruby-on-rails - 安装 sunspot_solr 时出错

ruby-on-rails - ActiveRecord 条件覆盖和 default_scope

python re codecs ä ö,芬兰语,定义单词

javascript - javascript中的正则表达式24小时时间验证

javascript - 如何在javascript中使用正则表达式捕获以某种字符串开头和结尾的字符串

ruby - 为什么 Pathname 不被视为字符串(或者什么时候可以将 to_str 方法添加到类中)?