Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式:根据单词匹配前50个字符_Javascript_Regex - Fatal编程技术网

Javascript正则表达式:根据单词匹配前50个字符

Javascript正则表达式:根据单词匹配前50个字符,javascript,regex,Javascript,Regex,我试图通过匹配前50个字符,然后连接“…”,来缩短导航条行,但是使用substr有时会造成一些笨拙的词组。 所以我想找出一种尊重语言的方法 我可以编写一个函数来实现这一点,但我只是想看看是否有更简单/更干净的方法 我已经在perl中成功地使用了这一点: ^(.{50,50}[^ ]*) 漂亮又优雅!但它在Javascript中不起作用:( match未定义使用带有正则表达式的方法包含最后一个单词 str.match(/^.{1,50}.*?\b/)[0] var str=“我正试图通过匹配

我试图通过匹配前50个字符,然后连接“…”,来缩短导航条行,但是使用
substr
有时会造成一些笨拙的词组。 所以我想找出一种尊重语言的方法

我可以编写一个函数来实现这一点,但我只是想看看是否有更简单/更干净的方法

我已经在perl中成功地使用了这一点:

^(.{50,50}[^ ]*)
漂亮又优雅!但它在Javascript中不起作用:(

match
未定义

使用带有正则表达式的方法包含最后一个单词

str.match(/^.{1,50}.*?\b/)[0]
var str=“我正试图通过匹配前50个字符然后连接“…”来缩短导航条行,但使用substr有时会造成一些笨拙的词组。因此我想找到一种尊重单词的方法。”;
log('带代码:',str.substr(0,50));
console.log('Using match:',str.match(/^.{1,50}.*?\b/)[0]);
您可以
.split()
\s
,在
循环中,当
50
或更大时,在
变量
.slice()处累积每个单词的长度
,在
.slice()处为
计算包含单词的每个数组元素的字符数
在数组的当前迭代中,
.join()
带有空格字符
.concat()
省略号,
中断
循环

let catName=“一个长度超过50个字符的字符串,我想缩写它”;
让[停止,res]=[50,”;
如果(catName.length>停止){
设arr=catName.split(/\s/);
for(设i=0,n=0;i=停止){
res=arr.slice(0,i).join(“”).concat(“…”);
打破
};
}
}否则{
res=catName.slice(0,50).concat(“…”)
}
document.querySelector(“pre”).textContent=res;

使用正则表达式最简单的解决方案可能是使用方法。如果字符串少于50个字符,则不会失败:

// abbreviate strings longer than 50 char, respecting words
if (catName.length > 50) {  
    catName = catName.match(/^(.{50,50}[^ ]*)/)[0] + '...';
}
var str='一个长度超过50个字符的字符串,我想缩写它';

log(str.replace(/^(.{50}[^]*).*/,'$1…');
修改普拉诺夫的答案,我认为这是有效的,也是最简洁的:


我的OP中的正则表达式确实有效,但它在循环中使用,并且被已经少于50个字符的字符串阻塞。

你的问题是什么?
我可以编写一个函数来实现这一点,但我只是看看是否有更简单/更干净的方法。
函数将是最容易理解的方法(对于后面的人)想想单词的实际含义:单词可以连字符,后面可以加标点符号,可以被引用,等等。你打算仅仅在正则表达式中解释所有这些吗?“所以我想找出一种尊重单词的方法。”预期结果是什么?你是想得到前50个字符还是前50个单词?前50个字符。实际上,我用我原来的正则表达式将第一个回复的答案混合在一起,结果是:
let match=catName.match(/^(.{50,50}[^]*)/)
著名的遗言。您的代码不能使用Unicode字符串,因为JS正则表达式中的边界设置不能使用Unicode字符串。它也不能使用少于50个字符的字符串。@VisioN:是的……我认为我们需要实现自定义的前瞻断言(不确定)…@VisioN:已更新为使用小于50个字符的字符串。如果简单的
[^]
在OP.ah!甚至better@midget2000x是的,又好又短
:)
一个疑问。。。如果第50个字符是
a
,下一个字符是
(或任何其他符号)@PranavCBalan是的,边界将是理想的,如果它在JavaScript引擎中正确实现的话。@VisioN:无论如何,这看起来很简单:)。。。我认为在否定字符类中添加必要的字符可以解决这个问题
str.replace(/^(.{50}[^ ]*).*/, '$1...');
// abbreviate strings longer than 50 char, respecting words
if (catName.length > 50) {  
    catName = catName.match(/^(.{50,50}[^ ]*)/)[0] + '...';
}