【问题标题】:Java String.split() with a regex带有正则表达式的 Java String.split()
【发布时间】:2012-11-05 02:20:56
【问题描述】:

我有一个解析问题。 我有存储为字符串的句子。我想抓取每个句子中的每个单词,但是我想过滤我抓取的单词。例如说我有这样一个句子:

Hell0 3v3ryb0dy @ stackoverflow $people \implies queen$ 等于 ~queen --> ~people。 /#逻辑

我会做以下事情:

  1. 抓住'H3ll0'
  2. 抢 3v3ryb0dy
  3. 扔掉@
  4. 从 '$people' 中获取 'people'
  5. 从 '\implies' 中获取 'implies'
  6. 从 'queen$' 中获取 'queen'
  7. 抓住'等于'
  8. 从'~queen'中获取'queen'
  9. 扔掉 -->
  10. 从“~people”中获取“people”
  11. 从“/#logic”中获取“逻辑”

基本上我只想要字母数字字符,每当我在单词之前或之后有一些其他字符(例如 \)时,我都想忽略这个其他字符。

目前我在做:sentence.split(" ")

这会从句子中获取单个单词,但它会抓取 '$people' 和 '~people' 并在我希望它们被同等对待时以不同方式对待它们。

  1. 我怎样才能做到这一点?
  2. 正则表达式能帮到我吗?

【问题讨论】:

    标签: java regex string parsing split


    【解决方案1】:

    用这个正则表达式\\W+分割字符串,分割成一个或多个非单词字符。

    String sentence = "Hell0 3v3ryb0dy @ stackoverflow $people \\implies queen$ equals ~queen --> ~people. /#logic";
    String[] split = sentence.split("\\W+");
    System.out.println(Arrays.asList(split));
    

    输出

    [Hell0、3v3ryb0dy、stackoverflow、人、暗示、女王、等于、女王、人、逻辑]

    【讨论】:

      【解决方案2】:

      我正在使用这个正则表达式。
      [^A-Za-z0-9 ]+(已编辑) 我得到的输出是:
      Hell0 3v3ryb0dy stackoverflow people implies queen equals queen people logic

      这是你所期待的吗?

      截自myregextester

      import java.util.regex.Pattern;
      import java.util.regex.Matcher;
      class Module1{
        public static void main(String[] asd){
        String sourcestring = "source string to match with pattern";
        Pattern re = Pattern.compile("[^A-Za-z0-9 ]+",Pattern.CASE_INSENSITIVE);
        Matcher m = re.matcher(sourcestring);
        String result = m.replaceAll("");
        }
      }
      
      $sourcestring after replacement:
      Hell0 3v3ryb0dy stackoverflow people implies queen equals queen people logic
      

      【讨论】:

      • 我仍然想用空格分隔我的句子。因此,假设我执行以下操作:wordsInSentence = sentence.split(" "); 我希望此代码还可以使用我的问题中的功能过滤掉非单词字符
      • @CodeKingPlusPlus:你试过我的答案了吗?
      • -1。有了这个,我得到了这个输出:[, H, e, l, l, 0, , 3, v, 3, r, y, b, 0, d, y, , , , s, t, a, c, k, o, v, e, r, f, l, o, w, , , p, e, o, p, l, e, , , i, m, p, l, i, e, s, , q, u, e, e, n, , , e, q, u, a, l, s, , , q, u, e, e, n, , , , , p, e, o, p, l, e, , , , l, o, g, i, c].
      • @CodeKingPlusPlus 为什么不在每个拆分词上尝试正则表达式 [^A-Za-z0-9]*
      • 您需要将* 更改为+[^A-Za-z0-9 ]+。您的正则表达式不能匹配任何内容,这意味着它将在每个字符边界匹配,无论它后面是什么。如果它碰巧看到任何不需要的字符,它将消耗它们,但有或无,它将始终匹配。您评论中的正则表达式 ([^A-Za-z0-9]*) 有同样的问题。它不会抛出异常或返回不正确的结果,但它会做很多不需要做的工作。
      猜你喜欢
      • 2019-03-30
      • 2012-04-09
      • 2015-05-02
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多