当前位置: 首页 > 知识库问答 >
问题:

为什么p{Punct}regex在这个例子中留下逗号

郑高驰
2023-03-14

我需要正则表达式在行中分离单词,这是我所拥有的

 public class Example {
    public static void main(String[] args) {
countWords(List.of("Some random stuff, another stuff, words in quotes „Example“, Oops!"));

    }
    public static void countWords(List<String> lines) {
        lines.
                stream().map(line -> line.split("[\\\\p{Punct}«»\\s\\d„“…)–]+")).forEach(e -> System.out.println(Arrays.toString(e)));
 }
    }

但结果是

[Some,ra,dom,s,ff,,a,o,her,s,ff,,words,i,q,o,es,Exam,le,,Oo,s!]

正如您所看到的,我们将单词拆分,留下了额外的逗号和感叹号(我认为p{Punct}包括感叹号)

共有2个答案

齐涛
2023-03-14

不清楚您试图完成什么,但输出与您的代码相匹配。正则表达式匹配以下任何情况的出现:\, p,{, P, u, n, c, t, }, ", ", 任何空格,任何数字,",",...,),-。

因此,您的线路在许多地方被分割。额外的逗号是因为数组toString是如何实现的。

这里有一个有用的资源来检查你的正则表达式实际上匹配什么:https://regex101.com/r/bHP5lu/1

卢勇
2023-03-14

取消Java字符串文字"\\\p{Punct}",我们得到:

\\p{Punct}

在字符类中,这被理解为反斜杠字符,字符p{/code>,punct},显然不是您想要的。

您在正则表达式中添加了一个额外的反斜杠。就像\d\s一样,\p{XXX}只需要一个反斜杠作为前缀,即使在字符类中使用。因此,您应该从Java字符串文字中删除两个反斜杠:

"[\\p{Punct}«»\\s\\d„“…)–]+"

 类似资料:
  • 描述 (Description) 字符类\p{Punct}匹配任何标点字符。 例子 (Example) 以下示例显示了Posix字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PosixCharacterClassDemo {

  • TextBox控件的要求是接受以下内容作为有效输入: null 更新: 第二个regex成功地匹配了console app中的目标字符串“Number of Rooms”,如下所示。但是,当输入为“房间数量”时,在aspx标记中使用相同的表达式并不匹配。以下是相关的aspx标记:

  • 我得到两个错误: Java:不兼容类型:无法推断类型变量R(参数不匹配;方法引用无效) 对toString的引用是不明确的,java.lang.Integer中的方法toString(int)和java.lang.Integer中的方法toString()都是不明确的 并且编译器无法推断所需的方法引用。 但是关于第二个,编译器引用的静态上下文在哪里? 这个错误与Integer类的方法toStrin

  • 在f2中,我们有指针 改为func f2(arg int)(int,*error)?或者,在这种情况下,为什么我们返回指针而不是值?

  • 我们正在对CITY、ST、ZIP形式的邮政编码进行丢失验证。这些可以跨越国家,因此以下所有内容都是有效的: > 宾夕法尼亚州匹兹堡,15020 安大略省汉密尔顿市L8E 4B3 我想验证的是,我们有三个逗号分隔的单词(空格可以)。所有这些都是有效的: foo、bar、baz 然而,这些将是无效的,因为它们没有两个逗号和三个单词: foo, bar 嘘,酒吧,巴兹,砰 foo,酒吧, foo, ba