【问题标题】:Java regex splitJava 正则表达式拆分
【发布时间】:2009-07-02 02:57:06
【问题描述】:

我有一些数据格式如下

2009.07.02 02:20:14 40.3727 28.2330 6.4 2.6 -.- -.- BANDIRMA-BALIKESIR 2009.07.02 01:38:34 38.3353 38.8157 3.5 2.7 -.- -.- 羽衣甘蓝(马来亚) 2009.07.02 00:10:28 38.8838 26.9328 3.0 3.0 -.- -.- CANDARLI KÖRFEZI (EGE DENIZI) 2009.07.01 23:33:31 36.8027 34.0975 8.2 2.9 -.- -.- GÜZELOLUK-ERDEMLI (MERSIN) 2009.07.01 22:32:44 38.9260 27.0338 5.0 3.4 -.- -.- CANDARLI KÖRFEZI (EGE DENIZI) 2009.07.01 22:12:37 40.2120 41.0378 3.7 2.9 -.- -.- OVACIK-ILICA (ERZURUM) 2009.07.01 22:10:53 38.9208 26.9502 5.0 3.5 -.- -.- ÇANDARLI-DIKILI (伊兹密尔) 2009.07.01 21:44:29 38.8695 27.1268 6.9 2.9 -.- -.- YUNTDAG-BERGAMA (伊兹密尔) 2009.07.01 21:27:53 38.9073 26.9895 5.0 3.0 -.- -.- CANDARLI KÖRFEZI (EGE DENIZI) 2009.07.01 21:18:19 38.9212 26.9060 5.0 3.4 -.- -.- CANDARLI KÖRFEZI (EGE DENIZI) 2009.07.01 21:12:15 38.8657 26.9447 13.7 3.8 -.- -.- CANDARLI KÖRFEZI (EGE DENIZI) 2009.07.01 21:09:43 38.9260 27.0853 5.0 3.1 -.- -.- ZEYTINDAG-BERGAMA (伊兹密尔) 2009.07.01 21:05:40 38.9153 26.9710 5.0 3.4 -.- -.- ÇANDARLI-DIKILI (伊兹密尔) 2009.07.01 20:29:02 37.6888 38.7212 5.0 3.3 -.- -.- AKINCILAR-KAHTA (ADIYAMAN) 2009.07.01 18:17:12 41.2700 36.0502 2.7 2.7 -.- -.- TAFLAN- (SAMSUN) 2009.07.01 17:50:03 38.6312 35.7962 5.0 2.8 -.- -.- ELBASI-BÜNYAN (KAYSERI)

我想在白线上拆分它,但我希望最后一列在有括号时不拆分?我希望每行分成 8 块。这可能吗?

【问题讨论】:

    标签: java regex split


    【解决方案1】:

    你为什么在这里使用正则表达式?

    数据文件完美对齐,可以用

    提取数据
    line.substring(0,12)
    line.substring(13,20)
    ..
    ..
    

    这样会快很多。

    【讨论】:

      【解决方案2】:

      将其放入正则表达式工具中,例如RegexBuddy

      但出于您的目的,很容易在\s+\s\s+ 上拆分并设置limit。这取决于您想要文本的哪些部分,这就是您使用该工具来帮助您编写正则表达式的原因。

      如果您特别想避免匹配以“(”开头的空格,这实际上并不能解决您的问题,因为可能存在诸如“单词(单词单词)”之类的行,您可以使用zero-width negative lookahead 组。类似\s+(?!\() .

      【讨论】:

      • 这不起作用。使用 \s+ 和限制为 8 的拆分会导致最后一个 -.- 和 name 字段被组合,这是假设您在每一行上执行拆分。假设您不介意将时间戳也分成两部分,则限制为 9 的拆分将起作用。
      • 他明确地说:“我希望每行分成8块”,我没有发现时间戳之间的单个空白。你可以把每一行和 .split(@"\s\s+",8)
      【解决方案3】:

      我猜你需要 9 个而不是 8 个。所以试试吧,line.split("\\s+", 9);

      【讨论】:

        【解决方案4】:

        这看起来像格式化的文本。第一个猜测是打破制表符。

        String[] parts = line.split('\t');
        

        如果这不起作用,我会在没有括号的空格上打断。在 Pattern 下的 javadoc 中查找前瞻模式语法: 例如如果你分开

        "ABC DEF (GHI)" 
        

        在正则表达式上:

        String regex="\\ (?!\\()";
        

        (读作“空格(?!X)”,其中“(?!X)表示“负前瞻匹配“X”,转义的openparen“\(”被替换)。

        你得到“ABC,DEF (GHI)”

        假设文本是制表符分隔的,按数字位置解析将不起作用。

        【讨论】:

        • 如果是制表符分隔,就用string.split("\t")
        猜你喜欢
        • 2021-12-04
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        相关资源
        最近更新 更多