此正则表达式查找包含 3 个或更少字符的单词,以便可以在它们之前放置一个不间断的空格。
smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/gi, // words with 3 or less characters
有没有办法让表达式只适用于连续的 2 个单词?
示例
目前,字符串:
Singapore, the USA and Vietnam.
将变成:
Singapore, the USA and Vietnam.
如果表达式仅应用于连续 2 个单词,则会显示
Singapore, the USA and Vietnam.
这是完整的脚本:
ragadjust = function (s, method) {
if (document.querySelectorAll) {
var eles = document.querySelectorAll(s),
elescount = eles.length,
smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/gi, // words with 3 or less characters
while (elescount-- > 0) {
var ele = eles[elescount],
elehtml = ele.innerHTML;
if (method == 'small-words' || method == 'all')
// replace small words
elehtml = elehtml.replace(smallwords, function(contents, p1, p2) {
return p1 + p2.replace(/\s/g, ' ');
});
ele.innerHTML = elehtml;
}
}
};
这是来自 RagAdjust
最佳答案
我知道这不是您所要求的,但我认为代码审查不会有什么坏处:
- 我认为在这种情况下,单词边界
\b
比\s|^
更好。 - 您的匹配项中有
A-Z
和a-z
字符,但您使用的是i
不区分大小写的运算符。 {0,1}?
是多余的 - 可以使用?
将其设为可选,或使用{0,1}
将其设为可选使其匹配零次或一次。- 如果您的字符集中需要有破折号,请将其放在末尾,这样就不会出现不明确的正则表达式,例如这个
[a-z_-]
会更好比[a-z-_]
。 - 如果不需要捕获值,请使用非捕获括号
(?:)
。
所以,这是清理后的正则表达式:
/\b((?:[a-z_(-]{1,2}(?:'|')*[a-z_,;-]?\s)+)/gi
我很确定当您从编辑器粘贴此内容时,'|'
位是某种拼写错误。不确定它应该是什么。
关于javascript - 正则表达式,指定循环次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21249498/