我在这个让我疯狂的正则表达中寻求你的智慧。
我想用冒号替换第二个下划线。就是这样。
到目前为止:
my $str = "bythepower_of_grayskull";
$str =~ s/.*?_.*?(_)/:/g;
print "$str\n";
当前输出::grayskull
所需的输出:bythepower_of:grayskull
答案 0 :(得分:2)
您需要将捕获组放在要保留的部分周围,而不是要替换的部分。然后在替换中使用$1
复制捕获的文本。
$str =~ s/(.*?_.*?)_/$1:/;
如果只有2个下划线,则不需要g
修饰符,因为只进行了一次替换。
答案 1 :(得分:1)
您可以捕获first underscore + some string
然后second underscore
的出现并相应地替换。
正则表达式: (_.*?)_
说明:
(_.*)
匹配第一个下划线和一些字符串。
(_)
与第二个下划线匹配。
替换为:替换为\1:
<强> Regex101 Demo 强>
正则表达式: _([^_]*$)
说明:由于您的字符串只有两个下划线,因此此正则表达式将从字符串末尾捕获第一个。
_
匹配字符串末尾的第一个下划线。 (从头开始。)
([^_]*$)
匹配字符串的其余部分直到结束。
替换为:替换为:\1
<强> Regex101 Demo 强>
您也可以使用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;
}
}
}