【问题标题】:Split a string contain hyphen and minus sign拆分包含连字符和减号的字符串
【发布时间】:2018-02-12 12:58:34
【问题描述】:

这个问题和我之前的问题Split a string contain dash and minus sign类似。但是我问错了,然后它的语义略有不同,人们从这个角度回答(包括)。因此,与其修改那个问题,我认为最好提出一个新问题。

我必须拆分一个包含连字符减号和减号的字符串。我尝试根据 unicode 字符(https://en.wikipedia.org/wiki/Hyphen#Unicode)进行拆分,但它仍然考虑与连字符减号相同的减号。有什么办法可以解决吗?

预期输出

(计数)

(美国)

-1

实际输出

(计数)

(美国)

// 实际上会在此处打印空白行,但 SO 编辑器会挤压空白行

1

public static void main(String[] args)  {
        char dash = '-';
        int i = -1;
       String a = "(country)" + dash + "(US)" + dash + i;
        Pattern p = Pattern.compile("-", Pattern.LITERAL);
        String[] m = p.split(a);
        for (String s : m) {
            System.out.println(s);
        }
    }

【问题讨论】:

  • 尝试使用-符号后面不跟数字,例如:Pattern.compile('-[^0-9]')
  • - 和 \u002D 实际上是完全相同的字符。所以你无法区分它们。因此,如果您的数据包含减号,请使用不同的分隔符,或者仅使用固定数量的字段进行拆分(仅当只有最后一个字段可以包含减号时才有效)。
  • 为了避免混淆,我将 unicode 值更改为字符
  • 根据en.wikipedia.org/wiki/Hyphen#Unicode,我认为减号 unicode(U+2212 − MINUS SIGN) 与连字符减号 unicode 不同。但是java split无法区分这2个
  • @ErwinBolwidt,他这样做了,但他预计 Java 的 Integer.toString 没有。不幸的是(或不是),Java 使用 \u002d 作为减号,而不是 \u2212。

标签: java regex


【解决方案1】:
char dash = '\u2010'; // 2010 is hyphen, 002D is hyphen-minus
int i = -1;
String a = "(country)" + dash + "(US)" + dash + i;
Pattern p = Pattern.compile("\u2010", Pattern.LITERAL);
String[] m = p.split(a);
for (String s : m) {
    System.out.println(s);
}

整数的字符串表示总是使用连字符-减号作为负号:

来自Integer.toString:

如果第一个参数为负数,则结果的第一个元素是 ASCII 减号字符“-”(“\u002D”)。如果第一个参数不是负数,则结果中不会出现符号字符。

所以最后你的字符串有 3 个连字符减号。这就是为什么split 无法区分它们的原因。

由于您无法更改整数的字符串表示形式,因此您需要更改dash 变量以存储连字符而不是连字符减号。现在您的字符串中有 2 个连字符和 1 个连字符减号,使 split 能够区分它们。

【讨论】:

  • 这个语句是否有java文档“整数的字符串表示总是使用连字符减号作为负号”?
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多