【问题标题】:Javascript trim multiline string without cutting wordsJavascript修剪多行字符串而不剪切单词
【发布时间】:2015-03-15 09:51:56
【问题描述】:

我正在寻找将字符串修剪为一定长度的字符而不剪切单词的答案。我搜索了问题,发现了这个:

javascript shorten string without cutting words

我想使用@Hamish 的答案来替换正则表达式,但遇到了多行文本的问题。

@Hamish 的回答:

"this is a longish string of test".replace(/^(.{11}[^\s]*).*/, "$1"); 
//"this is a longish"

我搜索了类似的问题,发现点 '.'不包括换行符\n。通常可以在末尾结束一个 's' 以使点也匹配换行符,但在 javascript 中这显然不起作用。 我在其他线程中读到我应该使用 [\s\S] 来匹配任何字符。 所以我尝试像这样使用@Hamish 的正则表达式:

infotext = infotext.replace(/^([\s\S]*{10}[^\s]*).*/, "$1");

然后我收到一条错误消息:

Uncaught SyntaxError: 
Invalid regular expression: /^(\[\s\S\]*{10}[^\s]*).*/: Nothing to repeat.

谁能帮我解决这个问题。我真的找不到匹配任何角色的解决方案...... 提前谢谢。 M

【问题讨论】:

  • 您能否发布 infotext 的内容,以便我们重现问题。
  • * 已经是一个转发器,您不能在它之后使用{10} 指定另一个转发器。这相当于指定**??。如果你仔细想想,说“重复多次 (*),然后正好重复 10 ({10}) 次”是没有意义的。
  • 嘿 Merc。如果您接受您提出的问题的答案,那就太好了。因为这就是人们首先回答你的原因。我确信您的问题的答案已经提供。
  • @Manticore 你是绝对正确的。我只是没有时间再次讨论这个问题。由于截止日期非常紧迫,我不得不先解决其他问题。我现在看看。对不起!

标签: javascript regex string trim cut


【解决方案1】:

你可以试试:

infotext = infotext.replace(/^([\s\S]{10}\S*)[\s\S]*/, "$1");

问题是你使用[\s\S]*{10}

JSFiddle

【讨论】:

  • @kasperTaeymans:我刚刚尝试修复无效的正则表达式问题。如果 OP 告诉我们预期的输出,那么我当然可以进一步调整它。
  • 可能是/^([\s\S]{10}\S*).*/mgwhat OP needs here
  • 如上所述,我提供的原始答案只是修复 无效的正则表达式 OP 得到的。我假设 OP 已经有一个有效的正则表达式。现在回到这个答案,这实际上与/^(.{11}\S*).*/mg 相同,但是您为什么认为 OP 不想要它,因为我们甚至没有看到 OP 的预期输出。
  • @kasperTaeymans:不,他是说/^([\s\S]*{10}[^\s]*).*/ 不起作用。他通过将. 更改为[\s\S] 自己解决了最初的问题,但后来他通过将{11} 更改为*{10} 再次破坏了它。但是,我认为添加 mg 标志是错误的。按照我的阅读方式,他想在字符串的开头进行一次替换,而不是在每一行的开头进行多次替换。
  • @kasperTaeymans 是的,你是对的。我只是想修剪一个段落,其中包括几个多行字符,直到第一个让我们说 150 个字符而不删减一个词。我粘贴了上面的答案,它似乎有效。感谢大家在这里讨论,请原谅我花了这么多时间回到这个帖子。
【解决方案2】:

jsfiddle demo

infotext="this is a longish string of test.\n bla bla bla bla text here";
infotext = infotext.match(/^.*$/m)[0].replace(/^([\s\S]{10}\S*).*/, "$1");
console.log(infotext); //this is a longish

【讨论】:

    【解决方案3】:

    您可能正在寻找的正则表达式是

    /^([\s\S]{9}((?=\s)\s|[^\s]*)).*/i
    

    在您的情况下,您必须将您的线路更改为此

    infotext = infotext.replace(/^([\s\S]{9}((?=\s)\s|[^\s]*)).*/i, "$1");
    

    这包括任何类型的 9 个字符,如果第 10 个是空格,那么正则表达式将在它之后停止,如果它不是空格,它将包括该单词的其余部分,直到下一个空格,因此它不会被剪切。

    jsfiddle | regex101

    我只能建议您访问 regex101.com 并使用一些正则表达式进行测试以掌握它。

    【讨论】:

    • 这没有帮助。 ((?=\s)\s|[^\s]*))([^\s]*) 完全相同,只是有时会占用空间。
    • 不,如果字符是非空格,它会关心包含单词的其余部分
    • 这就是[^\s]* 所做的。 [\s\S]{9} 完成后,它会继续捕获尽可能多的非空白字符。如果没有更多字符,或者下一个字符是空格,它将停止捕获并让.* 消耗剩余的任何内容。您的正则表达式也是如此,除了在第二种情况下它还捕获空白字符。
    • 他说他想“将字符串修剪为一定长度的字符”,并且通过 char 我也理解空白字符
    • @Manticore 感谢您的回答。但不幸的是,换行符仍在打破这种模式......我有这样的东西,它从 html 对象中获取文本:var infotext = $(this).text(); infotext = infotext.replace(/^([\s\S]{10}((?=\s)\s|[^\s]*)).*/i, "$1"); $(this).html(infotext); 但不幸的是,它被修剪了 10 个字符,然后我仍然有在换行符之后出现的部分字符串...
    猜你喜欢
    • 2011-07-24
    • 2013-08-17
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多