3

这是我尝试做的一个例子:

This is a paragraph of text.  
<-This is some text to be left aligned<-
This is some more text.

This is a paragraph of text.  
                       ->This is some text to be centered<-
This is some more text.

This is a paragraph of text.  
                                        ->This is some text to be right aligned->
This is some more text.

箭头字符 <- -> 用于(由用户)指定他们想要对齐文本的方式。到目前为止,这是我一直在整理的内容:

var text = "->This is some text to be centered<-";
var center_text = text.match("->(.*)<-");
if(center_text){
    text = '<span style="text-align:center;">'+center_text[1]+'</span>';
    console.log(text);
}

虽然这确实有效,但如果出现以下两种情况,它就会中断:->Text<- ->Text2<-,它只会替换第一个 -> 和最后一个 <- 并忽略中间。

我需要正则表达式能够识别它应该替换每组这些箭头,即 ->Text<- 是一个替换,->Text-> 是另一个替换。这在javascript中可能吗?

更新:

var text = "This is a paragraph.  <-This is left aligned<-.  This is a paragraph.  ->This is center aligned<-.  This is a paragraph.  ->This is right aligned->.  This is a paragraph.  ->This is right aligned->. This is a paragraph. ->This is center aligned<-";
text = text.replace(/<-(.*?)<-/g, '<span style="text-align: left;">$1</span>');
text = text.replace(/->(.*?)<-/g, '<span style="text-align: center;">$1</span>');
text = text.replace(/->(.*?)->/g, '<span style="text-align: right;">$1</span>');

console.log(text);

这是基于以下答案,但这会中断。这是它真正变成的样子:

This is a paragraph.  <span style="text-align: left;">This is left aligned</span>.  This is a paragraph.  <span style="text-align: right;">This is center aligned<span style="text-align: left;">.  This is a paragraph.  </span>This is right aligned<span style="text-align: right;">.  This is a paragraph.  </span>This is right aligned<span style="text-align: right;">. This is a paragraph. </span>This is center aligned</span>

如何解决这个问题,有没有更优雅的方法呢?

在此先感谢,正则表达式不太好。抱歉,在发布此最新更新之前没有在下面看到答案。

4

3 回答 3

5

你为什么打电话String#match?您可以在一次String#replace通话中做到这一点:

var text = "->Text<- ->Text2<-";
var repl = text.replace(/->(.*?)<-/g, "<center>$1</center>");
//=> "<center>Text</center> <center>Text2</center>"
于 2013-09-29T16:39:20.133 回答
3

因为您的中心、左对齐和右对齐块使用相同的分隔符,所以尝试一次仅匹配一种类型块的策略会冒过度匹配的风险。考虑这个例子:

-> left ->
<- right <-

简单地应用替换为的规则->(.*?)<-<center>$1</center>导致:

<center> left ->
</center> right <-

我认为您必须尝试同时匹配居中、左对齐和右对齐的块。像这样的东西会起作用:

var result = 
    text.replace(
        /(<-|->)(.*?)(<-|->)/g,
        function(m, l, c, r) {
            var cls = "";
            if (l == "<-" && r == "<-") {
                cls = "align-left";
            } else if (l == "->" && r == "->") {
                cls = "align-right";
            } else if (l == "->" && r == "<-") {
                cls = "align-center";
            } else if (l == "<-" && r == "->") {
                cls = "align-justify";
            }

            return '<div class="' + cls + '">' + c + '</div>';
        });

在此处查看此操作。

于 2013-09-29T16:50:25.063 回答
1

是的,把你的贪婪.*改为懒惰.*?

var center_text = text.match("->(.*?)<-");

或者你也可以使用这样的东西:

var center_text = text.match("->((?:(?!<-).)*)<-");

也就是说,我想知道为什么在可以使用替换时使用匹配,并且可以对所有三个对齐方式使用三个正则表达式:

var regexc = /->(.*?)<-/g;  // Regex for centre
var regexl = /<-(.*?)<-/g;  // Regex for left
var regexr = /->(.*?)->/g;  // Regex for right
var replacec = "<span style=\"text-align:center;\">'$1'</span>"; // Centre replacement
var replacel = "<span style=\"text-align:left;\">'$1'</span>";   // Left replacement
var replacer = "<span style=\"text-align:right;\">'$1'</span>";  // Right replacement

var results = text.replace(regexc, replacec).replace(regexl, replacel).replace(regexr, replacer);

jsfiddle 演示

于 2013-09-29T16:50:49.880 回答