【问题标题】:Javascript regex, match all words before length limitJavascript正则表达式,匹配长度限制之前的所有单词
【发布时间】:2021-04-12 07:53:00
【问题描述】:

我正在尝试将长标题分成不同的小部分。每个小部分不应超过 10 个字符的限制,我找不到解决方案... 目前,我正在尝试使用/(.{10}\S*)\s/,但使用TESLA AND MICROSOFT AND ANOTHER WORD 进行测试它还会返回包含在限制中的单词(TESLA AND MICROSOFT AND ANOTHER WORD),我不想要它。 .. 我的意思是,预期的结果应该是少于 10 个字符的 TESLA AND... 有简单的方法吗?

编辑: 我想要做的是将单行文本拆分为多行,如果有多个单词,行长不应大于 10 个字符。如果单个单词超过 10 个字符,则应返回完整单词。 例如。 TESLA AND MICROSOFT ANDANOTHERLONGWORD AND OTHER LONGWORDS

这段文字应该是:

TESLA AND
MICROSOFT
ANDANOTHERLONGWORD
AND OTHER
LONGWORDS

【问题讨论】:

  • 您能否详细说明并提供更多示例?空格算在 10 个字符中吗?超过 10 个字符的单词怎么样?
  • 可能是这样的(?<!\S)\S.{1,8}\S(?!\S)regex101.com/r/XAQPjk/1
  • @Thefourthbird,试图与你的例子分开,我收到:[" ", "ANDANOTHERLONGWORD ", " "]
  • 而且并非所有浏览器都支持“负向回溯”功能。
  • @EugenSunic,不完全......这就是我想要的......如果有多个短词在一行中,最大长度为 10,并且超过限制的词字符应保持不变,不拆分 TESLA AND、MICROSOFT、ANDANOTHERLONGWORD、AND OTHER、LONGWORDS,

标签: javascript regex


【解决方案1】:

如果你想使用拆分,你可以使用捕获组来保留使用拆分后捕获的内容。

由于 split 可能会留下空条目,您可以将它们从最终结果中删除,并可选择使用 trim 删除尾随空格。

(?:\s|^)(\S.{0,9}|\S+)(?!\S)
  • (?:\s|^) 匹配一个空白字符或断言字符串的开头
  • (捕获组1
    • \S.{0,9}|S+ 匹配一个非空白字符和 0-9 次任意字符或匹配 1 个或多个非空白字符。
  • )关闭第一组
  • (?!\S) 在右侧声明一个空白边界。

const regex = /(?:\s|^)(\S.{0,9}|\S+)(?!\S)/;
[
  "TESLA AND MICROSOFT ANDANOTHERLONGWORD AND OTHER LONGWORDS",
  "I LOVE REGULAR EXPRESSIONS",
  "I",
  "TESLA AND MICROSOFT ANDANOTHERLONGWORD ANDANOTHERLONGWORD ANDANOTHERLONGWORD AND OTHER LONGWORDS"
].forEach(str => console.log(str
  .split(regex)
  .map(s => s.trim())
  .filter(Boolean)));

【讨论】:

  • 差不多了,但是当我有多个长词时,我得到了:[“TESLA AND”、“MICROSOFT”、“ANDANOTHERLONGWORD ANDANOTHERLONGWORD ANDANOTHERLONGWORD”、“AND OTHER”、“LONGWORDS”] 长词应该保持不变,但在不同的行中,因为超过了长度限制
  • @OprisorValeriuVladut 我已经用更多示例更新了模式
【解决方案2】:

你可以试试这个:

/(?!\s)(?:[A-Z\s-]{0,9}[A-Z]|[A-Z-]+)\b/mg
  • (?!\s) 确保第一个字符不是空格
  • (?:...)非捕获组
  • [A-Z\s-]{0,9}[A-Z-] 任意 [A-Z-] 字符和空格,长度为 0-9,以 [A-Z-] 结尾(消除两端的空格)
  • |[A-Z-]+ 或任意长度的长单词,中间没有空格
  • \b 前面有单词边界

查看test results

const text = 'S-TESLA INSTALACOES INDUSTRIAIS EIRELI';

const regex = /(?!\s)(?:[A-Z\s-]{0,9}[A-Z]|[A-Z-]+)\b/mg;

console.log(text.match(regex));

【讨论】:

  • 差不多了,但是有没有可能匹配各种字符?例如,我有:S-TESLA INSTALACOES INDUSTRAIS EIRELI,结果是:["S", "TESLA", "INSTALACOES", "INDUSTRIAIS", "EIRELI"] S-TESLA 单词不应该被拆分
  • 是的,那就是(?!\s)(?:[A-Z\s-]{0,9}[A-Z]|[A-Z-]+)\b,只需在[A-Z] 集合中添加允许的字符
猜你喜欢
  • 1970-01-01
  • 2014-03-14
  • 2012-02-21
  • 2017-12-28
  • 1970-01-01
  • 2011-06-03
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多