Ruby Regex匹配换行后跟任何东西(3个大写字符后跟管道)

时间:2016-02-23 18:43:08

标签: ruby-on-rails ruby regex sublimetext

(希望)这里简单的正则表达式问题。我希望匹配一个或多个新行,这些新行后面没有三个大写字符和一个管道(|)的特定模式,并将其删除。

举个例子,我想转此:

foo bar foo bar.



Normal

0

false

false

false



EN-US

JA


X-NONE




foo bar foo bar




|||||HH
OBX|156|TX|foo bar|||N
OBX|157|TX|foo bar

进入这个:

foo bar foo bar. Normal  0 false  false false  EN-US JA  X-NONE|||||HH
OBX|156|TX|foo bar|||N
OBX|157|TX|foo bar

我的正则表达式在Sublime中效果很好:

(\n+)(?!MSH|PID|NTE|PV1|RXO|ORC|DG1|OBR|OBX).*

但是在红宝石中,它没有摆脱新线。将sublime regex转换为rails的regex时,我有什么遗漏吗?

@r.force_encoding("UTF-8").gsub("\r\n","\r").gsub("(\r+)(?!MSH|PID|NTE|PV1|RXO|ORC|DG1|OBR|OBX)(.*)"," $2")

3 个答案:

答案 0 :(得分:1)

str = <<-MULTI
foo bar foo bar.



Normal

0

false

false

false



EN-US

JA


X-NONE




foo bar foo bar




|||||HH
OBX|156|TX|foo bar|||N
OBX|157|TX|foo bar
MULTI

str.gsub(/(\n+)(?!MSH|PID|NTE|PV1|RXO|ORC|DG1|OBR|OBX).*/,'')

# It gives your desired result

答案 1 :(得分:1)

我的解决方案是单独处理这些行,多行正则表达式可能会让很多人感到困惑。

.each_line或.lines都返回各行。

.grep将数组与正则表达式或基于字符串的模式匹配。

.join将获取各行并从结果中返回单个多行字符串。

str.each_line
   .grep( /^[A-Z]{3,3}\|.+/ )
   .join( '' )

就正则表达式而言,让我们打破这一点,现在我们只是逐行处理事情:

^      - Starting at the beginning of the line.
[A-Z]  - Only match the range of chars from 'A' to 'Z' ( all cap chars ).
{3, 3} - Match only 3 chars, no more, no less.
\|     - Followed by a '|' char.
.+     - Followed by 1+ chars of anything.

答案 2 :(得分:0)

如果str是您的字符串,

r = /
    \n+                        # match one or more newlines
    (?!                        # start a negative lookahead
      #{Regexp.union(keepers)} # match one of keepers
      \|                       # match pipe--escape required
    )                          # close negative lookahead 
    /x                         # extended/free-spacing regex definition mode
  #=> /
      \n+
      (?!
        (?-mix:MSH|PID|NTE|PV1|RXO|ORC|DG1|OBR|OBX)
        \|
      )
      /x 

keepers = %w[ MSH PID NTE PV1 RXO ORC DG1 OBR OBX ]
  #=> ["MSH", "PID", "NTE", "PV1", "RXO", "ORC", "DG1", "OBR", "OBX"] 

puts str.gsub(r, "")
  # foo bar foo bar.Normal0falsefalsefalseEN-USJAX-NONEfoo bar foo bar|||||HH
  # OBX|156|TX|foo bar|||N
  # OBX|157|TX|foo bar