【问题标题】:How to separate String如何分隔字符串
【发布时间】:2017-03-04 13:28:24
【问题描述】:

如何分隔 (?abcd.efgdf) 的字符串?

我想要得到的是 "?abcd""efgdf" 分开并转移到另一个字符串容器。

我知道 split(".") 的用法,但是如果有两个这样的字符串怎么办。 前任。 (?abcd.efgdf) (?xcv.qwer) 拆分第二个字符串包含第一个字符串的结尾,即 "efgdf"。所以使用 split(".") 不是一种选择。

是否有任何分离此字符串的实现?

【问题讨论】:

  • 第二种情况会发生什么?你想要4个不同的值吗?请明确向我们展示输出
  • 对不起,我的错。输出应该是示例 (?abcd.efgdf) (?xcv.qwer)"?abcd" , "?xcv" 转移到 arraylist1 和 "efgdf", "qwer" 转移到 arraylist2 @TheLostMind

标签: java arrays string arraylist


【解决方案1】:

您可以使用正则表达式\(|\.|\)\s*\(|\)\??

DEMO

它包括所有这些分隔符:

  1. ( 第一个左括号
  2. .一个句号
  3. )\s*( 括号之间的可选空格s
  4. ) 右括号
  5. ? 第 4 点后面的可选问号 .

但它可能会创建一些空字符串,因此使用 java 8 流,您可以删除它们。这是代码

测试用例 1

String s = "(?abcd.efgdf)?";
String[] arr = Arrays.asList(s.split("\\(|\\.|\\)\\s*\\(|\\)\\??")).stream().filter(str -> !str.isEmpty()).collect(Collectors.toList()).toArray(new String[0]);
for (String a: arr) System.out.println(a);

输出

?abcd
efgdf

测试用例 2

String s = "(?abcd.efgdf) (?xcv.qwer)";
String[] arr = Arrays.asList(s.split("\\(|\\.|\\)\\s*\\(|\\)\\??")).stream().filter(str -> !str.isEmpty()).collect(Collectors.toList()).toArray(new String[0]);
for (String a: arr) System.out.println(a);

输出

?abcd
efgdf
?xcv
qwer

【讨论】:

  • 你能解释一下 .stream().filter(str -> !str.isEmpty()).collect(Collectors.toList()).toArray(new String[0] ); 有效吗? @RamanSahasi
  • @johnedgarotom stream -> 将列表转换为流; filter(str -> !str.isEmpty()) -> 过滤掉空字符串,collect -> 收集输出并将流转换为List; toArray() -> 将列表转换为数组
  • @johnedgarotom 看到这个问题Need for new String[0] in the Set toArray() method
【解决方案2】:

您可以将String两个分隔符pointspace 分开,如下所示:

String [] spl = "(?abcd.efgdf) (?xcv.qwer)".split("\\.| ");
//---------------------------------------------------^-^--

所以你会得到:

(?abcd
efgdf)
(?xcv
qwer)

如果你的str = "(?abcd.efgdf)" 你会得到:

(?abcd
efgdf)

【讨论】:

  • 我会试试@YCF_L先生
【解决方案3】:

你应该看看java.util.Pattern 这将帮助您解析整个字符串以找到您正在寻找的那些模式。

Pattern p = Pattern.compile("\((\?\w*)\.(\w*)\)");
Matcher m = p.matcher("(?abcd.efgdf) (?xcv.qwer)");
while (m.find()) {
    list1.add(m.group(1));
    list2.add(m.group(2));
}

正则表达式起初可能看起来很吓人,但对于更复杂的情况来说非常值得。通读 Pattern 的 JavaDoc 以了解可能性。它们会在您的示例中有所帮助,因为它们会为您消除所有空格和括号,因此您只需要满足您正在寻找的内容,而不是介于两者之间的内容。此外,这适用于包含任意数量的 (?abcd.abcd) 组的字符串。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2011-03-06
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2014-02-10
    • 2012-06-24
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多