在特定单词后打断字符串,并保留在新行上(正则表达式)

布拉姆·范罗伊

假设我有一个文本字段,用户可以在其中提交代码段。我想检测字符串中何时出现特定单词,然后对该单词之后的单词/字符进行处理

假设我们有一个字符串,在睡衣一词之后,我想在新行中开始代码的其余部分而没有缩进。(非常类似于代码美化器的工作方式。)输出将呈现在内部pre,所以我不需要任何<br>标签或其他HTML标签。

虽然有一些收获。

  1. 单词(睡衣之后的所有内容都必须从与前一行相同的“级别”(等于制表符缩进量)开始于新行。
  2. 逗号应始终以新行开头,并以制表符向后缩进
  3. 当有另一个字符时,假设一个感叹号!,以下代码必须从新行开始,并以制表符作为缩进。

例子:

输入

Bananas! Apples and pears walk down pyjamas the street! and they say pyjamas hi to eachother, pyjamas But then! some one else comes pyjamas along pyjamas Who is he?, pyjamas I don't know who! he is pyjamas whatever,,

输出

Bananas!
    Apples and pears walk down pyjamas
    the street!
        and they say pyjamas
        hi to eachother
    , pyjamas
    But then!
        some one else comes pyjamas
        along pyjamas
        Who is he?
    , pyjamas
    I don't know who!
        he is pyjamas
        whatever
    ,
,

我正在使用jQuery,因此您可以根据需要使用它。

这是上面代码的小提琴,因此您可以对其进行测试。到目前为止,我的结果一点也不好。(在textarea中键入内容,输出将发生变化。)由于我目前对regex几乎不了解,因此我需要一些帮助。

到目前为止,我有:

var a = $("textarea").val(),
    b = a.split('!').join("!\n  "),
    c = b.split('pyjamas').join("pyjamas \n");

$("textarea").keyup(function() {
    $("#output>pre").html(c);
});
马丁·恩德(Martin Ender)

这是一种简单的方法,不需要递归函数,甚至可以不使用正则表达式来完成(但我在这里发现它们很方便)。

function indent(str)
{
    var tabs = function(n) { return new Array(n+1).join('\t'); }

    var tokens = str.match(/!|,|pyjamas|(?:(?!pyjamas)[^!,])+/g);
    var depth = 0;
    var result = '';
    for (var i = 0; i < tokens.length; ++i)
    {
        var token = tokens[i];
        switch(token)
        {
        case '!':
            ++depth;
            result += token + '\n' + tabs(depth);
            break;
        case ',':
            --depth;
            result += '\n' + tabs(depth) + token;
            break;
        case 'pyjamas':
            result += token + '\n' + tabs(depth);
            break;
        default:
            result += token;
            break;
        }
    }
    return result;
}

首先,我们定义一个返回一串n制表符的函数(为方便起见)。

然后,我们将过程分为两个步骤。首先,我们tokenise字符串-这就是我们将其分成!,pyjamas和别的。(最后有关于正则表达式的解释,但是您也可以使用其他方法进行令牌化。)然后,我们简单地将令牌逐一遍历,将当前的缩进级别保留在中depth

  • 如果是,!我们增加深度,则打印!,换行符和制表符。
  • 如果是a,,我们减小深度,则打印一个换行符,制表符,然后打印,
  • 如果是pyjamas,我们只需打印该行,换行符和制表符即可。
  • 如果还有其他问题,我们只需打印该令牌即可。

而已。您可能要增加一些理智检查深度不变成负(即你有更多的,!) -目前,将简单地没有任何标签呈现,但你需要额外编写!后,要得到深度回升到1这很容易处理,但是我不知道您对此有什么假设或要求。

在换行符之后,它也不会占用额外的空格(请参阅最后的编辑)。

工作演示。

现在使用正则表达式:

/
  !               # Match a literal !
|                 # OR
  ,               # Match a literal ,
|                 # OR
  pyjamas         # Match pyjamas
|                 # OR
  (?:             # open a non-capturing group
    (?!pyjamas)   # make sure that the next character is not the 'p' of 'pyjamas'
    [^!,]         # match a non-!, non-, character
  )+              # end of group, repeat once or more (as often as possible)
/g

g找到所有比赛(而不是仅仅是第一个)。ECMAScript 6将带有一个y修饰符,这将使标记化更加容易-但令人讨厌的是,该y修饰符是ECMAScript自己的发明,而提供此功能的所有其他\G样式都在模式中使用了定位

如果您不熟悉正则表达式中的一些更高级的概念,请参考此出色的教程:

编辑:

这是一个更新的版本,修复了上面提到的有关换行符后出现的空格的上述警告。在处理结束时,我们只需使用以下命令删除制表符后的所有空格:

result = result.replace(/^(\t*)[ ]+/gm, '$1');

正则表达式匹配行的开头,然后捕获零个或多个制表符,然后捕获尽可能多的空格。空格周围的方括号不是必需的,但可以提高可读性。改性剂g再次是要找到所有这样的比赛,m^比赛在一个行的开头(而不是字符串刚开始的时候)。在替换字符串中,$1是指我们在括号中捕获的内容,即所有这些选项卡。因此,将选项卡写回,但要吞下空格。

工作演示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在特定单词后中断字符串,并保留在新行上(正则表达式)

来自分类Dev

用于识别仅包含特定单词的字符串的正则表达式

来自分类Dev

正则表达式可在Java字符串中查找特定单词

来自分类Dev

正则表达式在特定单词处拆分字符串

来自分类Dev

捕获包含2个特定单词的字符串的正则表达式

来自分类Dev

使用正则表达式从字符串中获取特定单词

来自分类Dev

正则表达式 - 仅匹配特定单词的字符串

来自分类Dev

正则表达式在特定单词之前的行上查找/替换字符

来自分类Dev

正则表达式匹配匹配字符串旁边不包含特定单词的字符串

来自分类Dev

正则表达式以匹配以特定单词开头的字符串,然后以斜杠分隔的单词

来自分类Dev

正则表达式如果包含特定单词则跳过字符串的一部分

来自分类Dev

字符串后的正则表达式行

来自分类Dev

正则表达式匹配Google Spreadsheet中特定单词后的前n行

来自分类Dev

正则表达式匹配Google Spreadsheet中特定单词后的前n行

来自分类Dev

我想在Java中使用正则表达式对字符串执行split(),但想将定界标记保留在数组中

来自分类Dev

如何通过正则表达式拆分字符串,同时将拆分器保留在数组中

来自分类Dev

正则表达式,用于将字符串匹配为单词,但保留多个空格

来自分类Dev

使用正则表达式,如何匹配特定字符串后的第一个单词?

来自分类Dev

在熊猫中,什么是使用正则表达式将子字符串保留在有匹配项的序列中,否则保留现有字符串的理想方法?

来自分类Dev

正则表达式可保留字符串中的特定字符

来自分类Dev

正则表达式可保留字符串中的特定字符

来自分类Dev

正则表达式,用于选择带有特定开始和结束字符串的文本,并且还排除特定单词

来自分类常见问题

正则表达式在匹配字符串后获取单词

来自分类Dev

正则表达式在固定字符串后替换单词

来自分类Dev

Javascript正则表达式可提取特定单词后的引号之间的所有字符

来自分类Dev

使用正则表达式 JAVA 用 * 替换特定单词后的每个字符

来自分类Dev

正则表达式:如果字符串在方括号内包含特定单词,则删除方括号及其内容

来自分类Dev

正则表达式:提取两个字符串之间的文本,并且该文本与特定单词匹配

来自分类Dev

如何用正则表达式替换具有特定单词的行中特定类型的所有字符

Related 相关文章

  1. 1

    在特定单词后中断字符串,并保留在新行上(正则表达式)

  2. 2

    用于识别仅包含特定单词的字符串的正则表达式

  3. 3

    正则表达式可在Java字符串中查找特定单词

  4. 4

    正则表达式在特定单词处拆分字符串

  5. 5

    捕获包含2个特定单词的字符串的正则表达式

  6. 6

    使用正则表达式从字符串中获取特定单词

  7. 7

    正则表达式 - 仅匹配特定单词的字符串

  8. 8

    正则表达式在特定单词之前的行上查找/替换字符

  9. 9

    正则表达式匹配匹配字符串旁边不包含特定单词的字符串

  10. 10

    正则表达式以匹配以特定单词开头的字符串,然后以斜杠分隔的单词

  11. 11

    正则表达式如果包含特定单词则跳过字符串的一部分

  12. 12

    字符串后的正则表达式行

  13. 13

    正则表达式匹配Google Spreadsheet中特定单词后的前n行

  14. 14

    正则表达式匹配Google Spreadsheet中特定单词后的前n行

  15. 15

    我想在Java中使用正则表达式对字符串执行split(),但想将定界标记保留在数组中

  16. 16

    如何通过正则表达式拆分字符串,同时将拆分器保留在数组中

  17. 17

    正则表达式,用于将字符串匹配为单词,但保留多个空格

  18. 18

    使用正则表达式,如何匹配特定字符串后的第一个单词?

  19. 19

    在熊猫中,什么是使用正则表达式将子字符串保留在有匹配项的序列中,否则保留现有字符串的理想方法?

  20. 20

    正则表达式可保留字符串中的特定字符

  21. 21

    正则表达式可保留字符串中的特定字符

  22. 22

    正则表达式,用于选择带有特定开始和结束字符串的文本,并且还排除特定单词

  23. 23

    正则表达式在匹配字符串后获取单词

  24. 24

    正则表达式在固定字符串后替换单词

  25. 25

    Javascript正则表达式可提取特定单词后的引号之间的所有字符

  26. 26

    使用正则表达式 JAVA 用 * 替换特定单词后的每个字符

  27. 27

    正则表达式:如果字符串在方括号内包含特定单词,则删除方括号及其内容

  28. 28

    正则表达式:提取两个字符串之间的文本,并且该文本与特定单词匹配

  29. 29

    如何用正则表达式替换具有特定单词的行中特定类型的所有字符

热门标签

归档