假设我有一个文本字段,用户可以在其中提交代码段。我想检测字符串中何时出现特定单词,然后对该单词之后的单词/字符进行处理。
假设我们有一个字符串,在睡衣一词之后,我想在新行中开始代码的其余部分而没有缩进。(非常类似于代码美化器的工作方式。)输出将呈现在内部pre
,所以我不需要任何<br>
标签或其他HTML标签。
虽然有一些收获。
!
,以下代码必须从新行开始,并以制表符作为缩进。例子:
输入:
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);
});
这是一种简单的方法,不需要递归函数,甚至可以不使用正则表达式来完成(但我在这里发现它们很方便)。
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
。
!
我们增加深度,则打印!
,换行符和制表符。,
我们减小深度,则打印一个换行符,制表符,然后打印,
。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] 删除。
我来说两句