使用正则表达式和javascript每2个单词插入回车符

时间:2013-04-05 15:45:26

标签: javascript regex insert return

我想制作一个每两个字插入一个回车的正则表达式...... 格式化的字符串也在一个数组中(这有什么不同吗?) 问题是:我在2周前听说过正则表达式,到目前为止,它让我觉得有人正在踩着我的大脑。 所以目前我提出了这个问题(忍受我......)

ticketName[i] = 'Lorem ipsum dolor sit amet consectetur adipisicing';
ticketName[i] = ticketName[i].replace(/(?:[a-zA-Z])* {2}/ig, ',');

令人惊讶的是......它不起作用!

任何人都可以帮助我吗?

当我完成这项工作时,当句子超过一定数量的字符时,我需要再用“......”替换句子的末尾。如果你有任何见解,因为我可能会回来那个也... 搜索该网站,只发现用回车替换句子的结尾。我猜我的pb在于这个词的定义。 非常感谢

5 个答案:

答案 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只是简单地说“使用第一个捕获组并追加换行符”。

Fiddle

答案 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');