使用JS中的RegExp删除某些类型的连续字符

时间:2017-05-24 10:56:15

标签: javascript regex

我需要一个正则表达式来删除特定的连续字符。

例如。我可以用

var filtered = oldString.replace(/[^[\w]\s]|(.)(?=\1)/gi, ""); 

如果我需要摆脱任何连续的角色。

我可以使用。

var filtered = oldString.replace(/[^[\w]\s]|(,|;|\s)(?=\1)/gi, ""); 

如果我需要摆脱连续的逗号,分号和空格字符。

但我真正需要的是使;,之类的字符串看起来像;

,,,,, ;这样的字符串看起来像单个逗号,

所以我需要摆脱任何类型的连续字符。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

似乎您希望匹配与相同模式匹配的字符块,但仅保留第一个匹配的字符。使用

.replace(/(\W)\W*/g, '$1')

请参阅regex demo

模式将匹配:

  • (\W) - 非字char(并捕获到第1组,以便替换模式中的$1反向引用可以恢复此字符)
  • \W* - 0个非单词字符(它们将从字符串中删除)

请注意,这是一种通用方法,在大多数情况下,应进一步调整模式。

答案 1 :(得分:0)

根据您的问题,我的理解是您要替换与第一个发生的字符连续发生的一组预定义字符。你可以这样做:

$custom_terms = get_terms('custom_taxonomy');
foreach($custom_terms as $custom_term) {
wp_reset_query();
$args = array('post_type' => 'custom_post_type',
    'tax_query' => array(
        array(
            'taxonomy' => 'custom_taxonomy',
            'field' => 'slug',
            'terms' => $custom_term->slug,
        ),
    ),
 );

 $loop = new WP_Query($args);
 if($loop->have_posts()) {
    echo '<h2>'.$custom_term->name.'</h2>';

    while($loop->have_posts()) : $loop->the_post();
        echo '<a href="'.get_permalink().'">'.get_the_title().'</a><br>';
    endwhile;
 }
}
  • 匹配([;,])[;,]*(?:[;,\h]*[;,]+)? ,和水平空格;中的任何一个,即单个空格或制表符
  • 仅匹配
  • 之间出现的空格
  • 使用捕获组捕获第一个匹配项,即\h
  • ([;,])是一个非捕获组,允许介于
  • 之间的空格

替换为(?:[;,\h]*[;,]+)?

这会将$1,和空格;的组合替换为第一个组合,即

  • \h将更改为,,,,,,,,;
  • ,将更改为;;;;; , , , , ;, ;, ;

Regex101 Demo