我想制作一个每两个字插入一个回车的正则表达式...... 格式化的字符串也在一个数组中(这有什么不同吗?) 问题是:我在2周前听说过正则表达式,到目前为止,它让我觉得有人正在踩着我的大脑。 所以目前我提出了这个问题(忍受我......)
ticketName[i] = 'Lorem ipsum dolor sit amet consectetur adipisicing';
ticketName[i] = ticketName[i].replace(/(?:[a-zA-Z])* {2}/ig, ',');
令人惊讶的是......它不起作用!
任何人都可以帮助我吗?
当我完成这项工作时,当句子超过一定数量的字符时,我需要再用“......”替换句子的末尾。如果你有任何见解,因为我可能会回来那个也... 搜索该网站,只发现用回车替换句子的结尾。我猜我的pb在于这个词的定义。 非常感谢
答案 0 :(得分:2)
被宠坏了选择,你是。我只是想再增加一个选项,同时回答你的第二个问题:
var mytest = "lorem ipsum dolor sit amet consectetur adipisicing";
var newtext = mytest.replace(/(\w+\W+\w+)\W+/ig,"$1\n");
alert(newtext);
result:
lorem ipsum
dolor sit
amet consectetur
adipisicing
注意 - 最后一个单词('adipisicing')未匹配,因此不予替换。它就在最后(并且没有尾随\n
)。
说明:
正则表达式:
( start a capture group comprising:
\w+ one or more "word" characters
\W+ one or more "not a word" characters
\w+ one or more "word" characters
) end capture group
\W followed by non-word
/ig case insensitive, global (repeat as often as possible)
并替换为:
$1 "The thing in the first capture group (everything matched in parentheses)
\n followed by a newline
第二个问题:
顺便说一句 - 因为你问的是“其他”问题 - 如何在一定数量的单词之后终止...
中的句子,你可以做以下事情:
var abbrev = mytest.replace(/((\w+\W+){5}).*$/,"$1...");
alert(abbrev);
result:
lorem ipsum dolor sit amet ...
说明:
( start capture group
( start second group (to be used for counting)
\w+ one or more "word" characters
\W+ one or more "non word" characters
){5} match exactly five of these
) end of capture group
.*$ followed by any number of characters up to the end of the string
并替换为
$1 the contents of the capture group (the first five words)
... followed by three dots
那里 - 一个问题有两个答案!
如果你想同时做两件事,那么首先做“缩短长句”,然后将其剪成较短的段。使用正则表达式对多行中的单词进行计数有点困难。
答案 1 :(得分:1)
我认为这应该有效:
str.replace(/((\s*\w+\s+){2})/g, "$1\n");
例如:
var str = 'Lorem ipsum dolor sit amet consectetur adipisicing';
str.replace(/((\s*\w+\s+){2})/ig, "$1\n");
"Lorem ipsum
dolor sit
amet consectetur
adipisicing"
正则表达式的解释:
( -> start of capture group. We want to capture the two words that we match on
( -> start of an inner capture group. This is just so that we can consider a "word" as one unit.
\s*\w+\s+ -> I'm consider a "word" as something that starts with zero or more spaces, contains one or more "word" characters and ends with one or more spaces.
) -> end of capture group that defines a "word" unit.
{2} -> we want two words
) -> end of capture group for entire match.
在替换中,我们$1\n
只是简单地说“使用第一个捕获组并追加换行符”。
答案 2 :(得分:1)
我希望您发现此处发布的正则表达式解决方案之一适合您。
或者,可以使用字符串split()和substring()方法完成相同的操作。下面的代码执行此操作并使用小提琴here。这并不像使用正则表达式那样优雅。
源代码示例
ticketName = new Array();
ticketName[0] = 'Lorem ipsum dolor sit amet consectetur adipisicing';
tmparray = new Array();
tmparray = ticketName[0].split(" ");
finalName = ""; // hold final name
totallength=0;
maxlength = 30;
// add a carriage return (windows) every two words
for (var i=0; i<tmparray.length; i++){
finalName += tmparray[i]+" ";
if ((i>0) && (((i-1)%2) == 0))
finalName +="\r\n";
}
// truncate result if exceed final length and add .... where truncated
if (finalName.length>maxlength)
finalName= finalName.substring(0,maxlength)+ ".....";
alert(finalName);
答案 3 :(得分:0)
让我们从正则表达式中的错误开始:
- [a-zA-Z]
当您使用 i 修饰符时,无需指定A-Z
- {2}
如Matt Ball在评论中所说,你只是想在这里连续匹配2个空格,你需要用括号重复整个组而不是
- ','
你说你想用回车符替换(\ r),但是你要插入一个逗号
现在,匹配单词的最佳方式(在我看来)如下:
/\b[a-z]+\b/
(\ Here代表\ b,我们将使用lazy operators)
你可以这样做:
replace(/(\b[a-z]+\b.*?\b[a-z]+\b)/, '$1\r')
答案 4 :(得分:0)
尝试:
'Lorem ipsum dolor sit amet consectetur adipisicing'
.match(/([a-z]+\s){2,2}/gi)
.join('\n');