首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析带有转义字符的分隔文本

解析带有转义字符的分隔文本
EN

Stack Overflow用户
提问于 2010-02-13 04:50:03
回答 2查看 879关注 0票数 2

我正在尝试解析(在Ruby语言中)有效的UNIX passwd文件格式:逗号分隔符,并使用转义字符\,这样任何转义的内容都应该被视为字面意思。我正在尝试使用正则表达式来实现这一点,但我做得不够--即使在使用Oniguruma进行前视/后视断言时也是如此。

从本质上讲,以下所有操作都应该有效:

代码语言:javascript
复制
a,b,c    # => ["a", "b", "c"]
\a,b\,c  # => ["a", "b,c"]
a,b,c\
d        # => ["a", "b", "c\nd"]
a,b\\\,c # => ["a", "b\,c"]

有什么想法吗?

第一个反应看起来相当不错。使用包含以下内容的文件

代码语言:javascript
复制
\a,,b\\\,c\,d,e\\f,\\,\
g

它提供了:

代码语言:javascript
复制
[["\\a,"], [","], ["b\\\\\\,c\\,d,"], ["e\\\\f,"], ["\\\\,"], ["\\\ng\n"], [""]]

很接近了。我不需要在第一次传递时做取消转义,只要一切都在逗号上正确拆分即可。我尝试了Oniguruma,最后得到了(更长的):

代码语言:javascript
复制
Oniguruma::ORegexp.new(%{
  (?:       # - begins with (but doesn't capture)
    (?<=\A) #   - start of line
    |       #   - (or) 
    (?<=,)  #   - a comma
  )

  (?:           # - contains (but doesn't capture)
    .*?         #   - any set of characters
    [^\\\\]?    #   - not ending in a slash
    (\\\\\\\\)* #   - followed by an even number of slashes
  )*?

  (?:      # - ends with (but doesn't capture)
    (?=\Z) #   - end of line
    |      #   - (or)
    (?=,)) #   - a comma
  },

  'mx'
).scan(s)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-13 05:01:32

试试这个:

代码语言:javascript
复制
s.scan(/((?:\\.|[^,])*,?)/m)

它不会翻译\后面的字符,但这可以在以后作为一个单独的步骤完成。

票数 3
EN

Stack Overflow用户

发布于 2010-02-13 04:53:18

我想尝试一下CSV类。

和正则表达式解决方案(hack?)可能如下所示:

代码语言:javascript
复制
#!/usr/bin/ruby -w

# contents of test.csv:
#   a,b,c
#   \a,b\,c
#   a,b,c\
#   d
#   a,b\\\,c

file = File.new("test.csv", "r")
tokens = file.read.scan(/(?:\\.|[^,\r\n])*|\r?\n/m)
puts "-----------"
tokens.length.times do |i|
  if tokens[i] == "\n" or tokens[i] == "\r\n"
    puts "-----------"
  else
    puts ">" + tokens[i] + "<"
  end
end
file.close

它将产生输出:

代码语言:javascript
复制
-----------
>a<
>b<
>c<
-----------
>\a<
>b\,c<
-----------
>a<
>b<
>c\
d<
-----------
>a<
>b\\\,c<
-----------
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2255031

复制
相关文章

相似问题

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