Javascript-如何使用正则表达式处理以下复杂字符串

Javascript-如何使用正则表达式处理以下复杂字符串,javascript,regex,string,Javascript,Regex,String,我有以下字符串,它将在较大的字符串中重复出现: [SM\u g]单词[SM\u h].[SM\u l]“ 请注意,在这个字符串中,短语“[SM_g]word[SM_h]”后面有三个部分: 句点(.)也可以是逗号(,) [SM_l] “ 零到所有这三个组件将始终出现在“[SM_g]字[SM_h]”之后。但是,它们也可以以任何顺序出现在“[SM_g]word[SM_h]”之后。例如,字符串也可以是: [SM\u g]word[SM\u h][SM\u l]“ 或 [SM\u g]单词[SM\u h]

我有以下字符串,它将在较大的字符串中重复出现:

[SM\u g]单词[SM\u h].[SM\u l]“

请注意,在这个字符串中,短语“[SM_g]word[SM_h]”后面有三个部分:

  • 句点(.)也可以是逗号(,)
  • [SM_l]
  • 零到所有这三个组件将始终出现在“[SM_g]字[SM_h]”之后。但是,它们也可以以任何顺序出现在“[SM_g]word[SM_h]”之后。例如,字符串也可以是:

    [SM\u g]word[SM\u h][SM\u l]“

    [SM\u g]单词[SM\u h]“[SM\u l]。

    [SM_g]字[SM_h]”

    [SM\u g]单词[SM\u h][SM\u 1]。

    [SM\u g]单词[SM\u h]。

    或者只是

    [SM\u g]word[SM\u h]

    这只是一些例子。重点是,有三个不同的组件(如果你认为这个周期也可以是逗号),可以在“[SMYH] Word [SMYG] ]之后出现,其中这三个组件可以是任意顺序的,有时一个、两个或所有三个组件都将丢失。 不仅如此,有时在“和之前的组件/[SM_g]单词[SM_h]之前最多会有一个空格

    例如:

    [SM_g]字[SM_h]”

    [SM_g]单词[SM_h][SM_l]”

    等等等等

    我试图通过在核心字符串中移动三个组件中的每一个来处理这个字符串(并保留空格,以防在&\quot;和前一个组件/[smu g]word[smu h]之前有空格)

    例如,
    [SM\u g]单词[SM\u h].[SM\u l]“
    将变成

    [SM\u g]word[SM\u l]“[SM\u h]

    [SM_g]字[SM_h]“[SM_l]”。
    会变成

    [SM\u g]word“[SM\u l].[SM\u h]

    或者,模拟在

    [SM_g]字[SM_h]”

    会变成

    [SM\u g]word.[SM\u h]

    等等

    我尝试了几种正则表达式的组合,但没有一种有效


    有人有建议吗?

    这似乎适用于您的流程,换句话说,
    更改子字符串位置

    (\[SM_g])([^[]*)(\[SM_h])((?=([,\.])|(\[SM_l])|( ?&\\?quot;)).*)?
    
    ,其中所有子字符串分别捕获到每个
    捕获组
    ,用于
    后处理

    [SM\u g]
    被捕捉到组
    1
    word
    被捕捉到组
    2
    [SM\u h]
    被捕捉到组
    3
    所有尾随部分的字符串被捕捉到组
    4
    [,\.]/code>被捕捉到组
    5
    [SM l]
    被捕捉到组
    6
    “到分组
    7

    因此,组
    1~3
    核心部分
    ,组
    4
    尾随部分
    ,用于检查尾随部分是否存在,组
    5~7
    是组4的
    子部分,用于后期处理

    因此,通过用捕获的组替换
    ,您可以按照所需的顺序轻松获得匹配字符串的
    位置更改输出字符串
    ,如下所示

    \1\2\7\3 or $1$2$7$3  etc..
    
    有关Javascript中的替换,请参阅本文

    但是上面的正则表达式不够精确,因为它可能允许对尾随字符串的子部分进行任何
    重复,例如
    \1\2\3\5\5\5\5
    \1\2\3\6\7\7\7\5\5

    为了避免这种情况,它需要采用只接受尾随字符串子部分可能的组合的条件。请参考此示例。有关顺序中可能的组合,请参考此示例


    但是如果正则表达式采用只允许可能的组合的条件,正则表达式将更加复杂,因此我留下上面简化的正则表达式来帮助您理解它。谢谢:-)

    如果需要,您需要将每个组件放在分组构造中的一个替换中,最大匹配尝试次数为
    3
    随笔:

    \[SM_g]word(\[SM_h])((?:\.|\[SM_l]| ?"){0,3})
    
    如果不是常量或特定关键字,可以用
    *?
    替换
    word

    然后在替换字符串中,您应该执行以下操作:

    $1$3$2
    
    var re=/(\[SM\u g]word)(\[SM\u h])((?:\.\[SM\u l]|?){0,3})/g;
    var str=`[SM_g]单词[SM_h][SM_l]`;
    
    console.log(str.replace(re,`1$3$2`);
    您可以将
    &
    更改为
    &;
    以获得所需的格式。您可以将代码块用于文字代码:
    使用
    用于引用(普通文本),而不是用于代码