【问题标题】:Regex: String match including punctuation正则表达式:字符串匹配,包括标点符号
【发布时间】:2019-01-05 16:19:25
【问题描述】:

From another question,我有这个表达式来匹配句子中的单词:

var sentence = "Exclamation! Question? Full stop. Ellipsis...";
console.log(sentence.toLowerCase().match(/\w+(?:'\w+)*/g));

完美运行。但是,现在我正在寻找一种方法来分别匹配感叹号、问号和句号。结果应如下所示:

[
  "exclamation",
  "!",
  "question",
  "?",
  "full",
  "stop",
  ".",
  "ellipsis",
  "."
]

只匹配省略号中的一个点,而不是单独匹配所有三个点。

任何帮助将不胜感激!

【问题讨论】:

  • 你想要的是\w+|[!?.]吗?
  • @Sweeper 谢谢但不完全,我只想匹配第一个省略号,而不是单独匹配所有点
  • 此外,该版本不适用于包含撇号的单词,例如“doesn't”、“wouldn't”等。

标签: javascript regex string replace match


【解决方案1】:

使用单词边界只返回省略号中的一个点怎么样?

var sentence = "Exclamation! Question? Full stop. Ellipsis...";
console.log(sentence.toLowerCase().match(/[a-z]+(?:'[a-z]+)*|\b[!?.]/g));

或否定前瞻:

var sentence = "Exclamation! Question? Full stop. Ellipsis...";
console.log(sentence.toLowerCase().match(/[a-z]+(?:'[a-z]+)*|[!?.](?![!?.])/g));

在您评论的场景扩展之后,消极的后视似乎是有效的。

var sentence = "You're \"Pregnant\"??? How'd This Happen?! The vasectomy YOUR 1 job. Let's \"talk this out\"...";
console.log(sentence.toLowerCase().match(/[a-z\d]+(?:'[a-z\d]+)*|(?<![!?.])[!?.]/g));

【讨论】:

  • @MysteryPancake 如果你有打破我模式的边缘案例,请更新你的问题并给我留言。
  • 我完全忘记了负前瞻,谢谢提醒。
  • @mickmackusa 非常感谢,这非常有效!只是一个小要求 - 这是否也适用于数字?我只需要将[a-z] 替换为\w 吗?
  • 也许消极的回顾会为您服务。我添加了另一个带有新模式和示例字符串的演示。
  • \w 包括下划线(带有数字和字母)。我为模式准确性/模式意图牺牲了模式的简洁性。如果您愿意,可以使用\w。实际上,由于转换为小写,我将在末尾删除i 模式修饰符。
【解决方案2】:

试试下面的代码

var sentence = "Exclamation! Question? Full stop. Ellipsis...";
console.log(sentence.toLowerCase().match(/[?!.]|\w+/g));

如果你只想要一个点,你可以使用类似 ---

var sentence = "Exclamation!!! Question??? Full stop. Ellipsis...";

var arr = sentence.toLowerCase().match(/[?]+|[!]+|[.]+|\w+/g);
arr = arr.map(function(item){
	return item.replace(/(.)\1+/g, "$1");
})

console.log(arr);

【讨论】:

  • 谢谢,差不多,但我只想匹配第一个省略号,而不是后面的所有点
  • 我已经编辑了我的答案,现在它应该适合你@MysteryPancake
  • 谢谢!对不起,我一直在打扰你,但我真的希望只能用正则表达式来完成。我可能会等待另一个答案,因为我的正则表达式很糟糕
猜你喜欢
  • 2010-10-18
  • 2012-02-09
  • 2016-05-10
  • 1970-01-01
  • 2017-09-15
  • 2023-03-04
  • 2017-09-30
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多