仅使用RegExp替换字符串

时间:2015-10-15 14:36:59

标签: javascript regex

我有一些字符串可以显示某些html标签,例如

this is a nice day for bowling <b>bbbb</b>

如何使用RegExp替换所有 b 符号,例如:blablabla:(例如),但外部html标记?

因此,在这种情况下,结果字符串应该变为

this is a nice day for :blablabla:owling <b>bbbb</b>

编辑:根据我收到的答案,我想更具体一点。首先,我只有一个字符串,而不是DOM元素,或其他任何东西。该字符串可能包含也可能不包含标签(打开和关闭)。主要的想法是能够替换文本中的任何地方,除了内部标签。例如,如果我有一个像

这样的字符串
not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>

正则表达式应该用真正的笑脸图像替换第一个:/,但不应该替换第二个和第三个,因为它们位于标签的内部(和部分标签)。以下是使用其中一个答案的正则表达式的示例代码段。

var s = 'not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>';
var replaced = s.replace(/(?:<[^\/]*?.*?<\/.*?>)|(:\/)/g, "smiley_image_here");
document.querySelector("pre").textContent = replaced;
<pre></pre>

奇怪但DEMO显示它捕获了正确的组,但替换函数中的相同正则表达似乎无法正常工作。

3 个答案:

答案 0 :(得分:0)

&#13;
&#13;
try {
    Class.forName("com.mysql.jdbc.Driver");
    Connection dbaTo = DriverManager.getConnection("jdbc:mysql://localhost:3306/ourDB1", "root", "");

    PreparedStatement stat2 = dbaTo.prepareStatement("SELECT * FROM tblEntry");
    journEnt = journCombo.getSelectedItem().toString();

    String sqlbebe = "INSERT INTO tblJournEnt(strEntJournCode, strEntJournType) VALUES (?, ?)";
    PreparedStatement stat3 = dbaTo.prepareStatement(sqlbebe);
    ResultSet resultaNgSet = stat2.executeQuery();

    if(resultaNgSet.next()) {
    do{ 
        kuhaEntCode = resultaNgSet.getString(1);    
        substring2 = kuhaEntCode.substring(Math.max(kuhaEntCode.length() - 3, 0));

    }while(resultaNgSet.next());
        } //IF////////////////////////////////////////////////////////////

    else{
        stringsaEnt = "Ent000";         
    }

    int convertToInt2 = Integer.parseInt(substring2);
    int addition2 = convertToInt2 + 1;

    if (addition2 >= 10) {
        String prd = "ent0"; 
        stringsaEnt = prd + addition2;
    }
    else {
        String prd2 = "ent00";
        stringsaEnt = prd2 + addition2; 
        //pasaEnt(stringsaEnt);

    }



    stat3.setString(1, stringsaEnt);
    stat3.setString(2, journEnt);
    stat3.addBatch();
    stat3.executeBatch();
    stat3.close();

}catch(Exception saiko) {

}
&#13;
var input = "this is a nice day for bowling <b>bbbb</b>";
var result = input.replace(/(^|>)([^<]*)(<|$)/g, function(_,a,b,c){
				return a
				+ b.replace(/b/g, ':blablabla:')
				+ c;
});
document.querySelector("pre").textContent = result;
&#13;
&#13;
&#13;

你可以这样做:

<pre></pre>

请注意,在大多数(绝大多数)实际复杂的用例中,操作解析的DOM而不仅仅是字符串会更方便。如果您从HTML页面开始,则可以使用库(某些库,如my one,接受正则表达式)。

答案 1 :(得分:0)

我认为你可以使用这样的正则表达式:(仅用于简单数据而不是嵌套数据)

/<[^\/]*?b.*?<\/.*?>|(b)/ig

[Regex Demo]

如果您想使用正则表达式,我建议您使用以下正则表达式递归删除所有标记,直到删除所有标记:

/<[^\/][^<]*>[^<]*<\/.*?>/g

然后使用替换来查找任何b

答案 2 :(得分:0)

使用b替换所有:blablabla:的正则表达式本身并不难:

.replace(/b/g, ":blablabla:")

将文本节点放在需要执行搜索和替换的位置有点棘手。

这是一个基于DOM的示例:

&#13;
&#13;
function replaceTextOutsideTags(input) {
  var doc = document.createDocumentFragment();
  var wrapper = document.createElement('myelt');
  wrapper.innerHTML = input;
  doc.appendChild( wrapper );
  return textNodesUnder(doc);
}
function textNodesUnder(el){
  var n, walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
  while(n=walk.nextNode())
  {
       if (n.parentNode.nodeName.toLowerCase() === 'myelt')
      		n.nodeValue =  n.nodeValue.replace(/:\/(?!\/)/g, "smiley_here"); 
  }
  return el.firstChild.innerHTML;
} 

var s = 'not feeling well today :/ check out this link <a href="http://example.com">http://example.com</a>';
console.log(replaceTextOutsideTags(s));
&#13;
&#13;
&#13;

在这里,我们只修改作为名为myelt的自定义创建元素的直接子节点的文本节点。

结果:

not feeling well today smiley_here check out this link <a href="http://example.com">http://example.com</a>