Perl正则表达式:找到第二个下划线并用字符串中的冒号替换

时间:2016-04-05 01:35:10

标签: regex string perl search replace

我在这个让我疯狂的正则表达中寻求你的智慧。

我想用冒号替换第二个下划线。就是这样。

到目前为止:

    my $str = "bythepower_of_grayskull";
    $str =~ s/.*?_.*?(_)/:/g;
    print "$str\n";

当前输出::grayskull

所需的输出:bythepower_of:grayskull

4 个答案:

答案 0 :(得分:2)

您需要将捕获组放在要保留的部分周围,而不是要替换的部分。然后在替换中使用$1复制捕获的文本。

$str =~ s/(.*?_.*?)_/$1:/;

如果只有2个下划线,则不需要g修饰符,因为只进行了一次替换。

答案 1 :(得分:1)

您可以捕获first underscore + some string然后second underscore的出现并相应地替换。

解决方案#1

正则表达式: (_.*?)_

说明:

  • (_.*)匹配第一个下划线和一些字符串。

  • (_)与第二个下划线匹配。

替换为:替换为\1:

<强> Regex101 Demo

解决方案#2

正则表达式: _([^_]*$)

说明:由于您的字符串只有两个下划线,因此此正则表达式将从字符串末尾捕获第一个

  • _匹配字符串末尾的第一个下划线。 (从头开始。)

  • ([^_]*$)匹配字符串的其余部分直到结束。

替换为:替换为:\1

<强> Regex101 Demo

解决方案#3

您也可以使用positive lookahead。这是对Solution #2的一点修改。你唯一需要做的就是预见rest of the string而不是捕捉它。

正则表达式: _(?=[^_]*$)

说明:

  • _匹配下划线后看起来没有下划线直到字符串结尾。因此,数学上将匹配第二个下划线。

替换为:替换为:

<强> Regex101 Demo

答案 2 :(得分:1)

请勿将g修饰符仅用于一次替换:

$str =~ s/_[^_]*\K_/:/;

答案 3 :(得分:1)

你需要的只是

import com.skype.User;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;

class BoardTableCellRenderer extends DefaultTableCellRenderer {


    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected, boolean hasFocus, int row, int col) {

        Component c = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, col);
        JLabel label = (JLabel)super.getTableCellRendererComponent(table, value,isSelected, hasFocus,row, col);
        //row is the username
        if(col == 0) {
            try {
                User temp = Functions.returnUser(value.toString());
                ImageIcon imageIcon = new ImageIcon(getClass().getResource("/" + temp.getStatus().toString() + ".png"));
                label.setIcon(imageIcon);
            } catch (Exception ex) {
            }
            return label;
        }else{
            return c;
        }

    }
}