Split on different newlines

前端 未结 8 1087
自闭症患者
自闭症患者 2021-02-01 12:57

Right now I\'m doing a split on a string and assuming that the newline from the user is \\r\\n like so:

string.split(/\\r\\n/)
<         


        
相关标签:
8条回答
  • 2021-02-01 13:00
    \n is for unix 
    \r is for mac 
    \r\n is for windows format
    

    To be safe for operating systems. I would do /\r?\n|\r\n?/

    "1\r2\n3\r\n4\n\n5\r\r6\r\n\r\n7".split(/\r?\n|\r\n?/)
    => ["1", "2", "3", "4", "", "5", "", "6", "", "7"]
    
    0 讨论(0)
  • 2021-02-01 13:07

    Are you reading from a file, or from standard in?

    If you're reading from a file, and the file is in text mode, rather than binary mode, or you're reading from standard in, you won't have to deal with \r\n - it'll just look like \n.

    C:\Documents and Settings\username>irb
    irb(main):001:0> gets
    foo
    => "foo\n"
    
    0 讨论(0)
  • 2021-02-01 13:13

    Another option is to use String#chomp, which also handles newlines intelligently by itself.

    You can accomplish what you are after with something like:

    lines = string.lines.map(&:chomp)
    

    Or if you are dealing with something large enough that memory use is a concern:

    <string|io>.each_line do |line|
      line.chomp!
      #  do work..
    end
    

    Performance isn't always the most important thing when solving this kind of problem, but it is worth noting the chomp solution is also a bit faster than using a regex.

    On my machine (i7, ruby 2.1.9):

    Warming up --------------------------------------
               map/chomp    14.715k i/100ms
      split custom regex    12.383k i/100ms
    Calculating -------------------------------------
               map/chomp    158.590k (± 4.4%) i/s -    794.610k in   5.020908s
      split custom regex    128.722k (± 5.1%) i/s -    643.916k in   5.016150s
    
    0 讨论(0)
  • 2021-02-01 13:14

    Did you try /\r?\n/ ? The ? makes the \r optional.

    Example usage: http://rubular.com/r/1ZuihD0YfF

    0 讨论(0)
  • 2021-02-01 13:15

    Perhaps do a split on only '\n' and remove the '\r' if it exists?

    0 讨论(0)
  • 2021-02-01 13:18
    # Split on \r\n or just \n
    string.split( /\r?\n/ )
    

    Although it doesn't help with this question (where you do need a regex), note that String#split does not require a regex argument. Your original code could also have been string.split( "\r\n" ).

    0 讨论(0)
提交回复
热议问题