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

正则表达式删除所有标点符号,但保留小数点和连字符

商开宇
2023-03-14

我正在尝试制作一个正则表达式,它可以删除所有标点和空格,但保留小数点和连字号。到目前为止,我已经:

String doc = "THE SOCIAL IMPACT OF THE CHERNOBYL DISASTER BY DAVID R. MARPLES (ST. MARTIN'S PRESS: $35, CLOTH; $14.95, PAPER; 316 PP., ILLUSTRATED; 0-312-02432-0)";
String doc = doc.replaceAll("[^a-zA-Z_0-9-]+", " ").toLowerCase();

它删除所有点,包括小数点。

我如何使它区分点周围的字符或数字?

预期产出:

 the social impact of the chernobyl disaster by david r marples st martin s press 35 cloth 14.95 paper 316 pp illustrated 0-312-02432-0

共有2个答案

凌智
2023-03-14

删除所有标点和空白,但保留小数点和连字符

您可以使用可选的捕获组来匹配十进制数,并使用back reference将其放回替换位置。

Java代码

String repl = str.replaceAll("(\\.\\d+|\\w+(?:-\\w+)+)?[\\s\\p{P}]+", "$1 "));

正则表达式演示

RegEx分手:

  • -开始捕获组
    • \\\\d-匹配一个点,后跟数字
    • |-或
    • \\w(?:-\\w)-匹配连字符单词

    替换字符串是:“$1”,这意味着可选组#1后面有一个空格。

裘安阳
2023-03-14

您可以尝试以下方法:

[^a-zA-Z0-9_.-]|(?<!\d)\.(?!\d)|(?<!\w)-(?!\w)

更新:

为连字符(?

并替换为"

说明:

  1. [^a-zA-Z0-9.-]在初始正则表达式中加入点,以避免初始正则表达式与之不匹配

正则表达式演示

Java演示示例来源:

final String regex = "[^a-zA-Z0-9_.-]|(?<!\\d)\\.(?!\\d)|(?<!\\w)-(?!\\w)";
final String string = "THE - . SOCIAL IMPACT OF THE CHERNOBYL DISASTER BY DAVID R. MARPLES "
        + "(ST. MARTIN'S PRESS: $35, CLOTH; $14.95, PAPER; 316 PP., ILLUSTRATED; 0-312-02432-0)\n\n\n";

String result=string.replaceAll(regex," ");
System.out.println(result);

 类似资料:
  • 问题内容: 我需要使用正则表达式在单词的 开头 和 结尾 处删除标点符号。似乎正则表达式将是最好的选择。我不想从“ you’re”之类的词中删除标点符号,这就是为什么我不使用.replace()的原因。 问题答案: 您不需要正则表达式即可执行此任务。使用有:

  • 问题内容: 我有以下代码可用于删除正则表达式字符串中的所有标点符号: 我如何更改它以允许连字符?如果您能解释您是如何做到的,那将很棒。我了解在这里,如果我错了,请纠正我,在标点符号之后加上P。 问题答案: 是-的补充-不是标点符号。所以这比赛什么,是 不是 (没有标点符号或破折号) -导致除破折号所有标点符号。 范例:http://www.rubular.com/r/JsdNM3nFJ3 如果您希

  • 为什么下面的正则表达式不匹配连字符(或与号、句号或逗号,尽管我暂时将它们排除在下面的字符类之外)?我在试着匹配字符串... ...(这是单词“hello”的语音表示),并且当字符串中有连字符时,匹配失败(上面列出的与数等相同)。 这种模式... ...起作用,根据regex101.com的说法,它本质上是完全相同的模式,所以我不明白为什么更长的模式不起作用。

  • 2.密码必须至少包含一个大写字母、一个小写字母、一个数字和一个标点符号。(例如a-z,a-z,0-9,!@#$%^&*()_+~-=`{}[]:“;'<>?,./) 我尝试使用:{}:“;'<>?,./-][])$` 但是,当我在中测试时,标点符号部分的解释并不清楚 标点符号的解释好像坏了,可以解释一下原因并帮我完成这个。

  • 我对正则表达式很陌生。我需要构造一个正则表达式,如果在下面的代码中使用,它将生成一个只有字母(大小写)、数字、、、和。 以下表达式不起作用:。它替换了一些字母,而不是所有不需要的字符。为什么它不起作用?

  • 问题内容: 我可以用来匹配所有标点符号(包括下划线)。 我想严格 排除 一个单词内的所有撇号。为此,我正在使用 但是,我不能让它们一起工作以匹配所有标点符号,但严格来说单词内的撇号除外。 我应该使用什么? 例子: 这应该不匹配。 这应该匹配。 这些应该匹配。 问题答案: 您可以在此处组合三个条件。 匹配除撇号外的所有标点符号使用 匹配所有撇号,后面没有字母。 匹配所有不带字母的撇号。 正则表达式: