【问题标题】:Javascript - how to use regex process the following complicated stringJavascript - 如何使用正则表达式处理以下复杂的字符串
【发布时间】:2018-04-19 03:36:58
【问题描述】:

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

[SM_g]word[SM_h].[SM_l] "

注意在这个字符串中的短语“[SM_g]word[Sm_h]”之后有三个组成部分:

  1. 句点 (.) 这也可以是逗号 (,)
  2. [SM_l]
  3. "

所有这三个组件的零将始终出现在“[SM_g]word[SM_h]”之后。但是,它们也可以以任何顺序出现在“[SM_g]word[SM_h]”之后。例如,字符串也可以是:

[SM_g]word[SM_h][SM_l]"

[SM_g]word[SM_h]"[SM_l].

[SM_g]word[SM_h]".

[SM_g]word[SM_h][SM_1].

[SM_g]word[SM_h].

或者只是

[SM_g]word[SM_h]

这些只是一些例子。关键是在“[SM_h]word[SM_g]”之后可以出现三个不同的组件(如果您认为句号也可以是逗号,则更多),其中这三个组件可以按任意顺序和 em> 有时会缺少一个、两个或所有三个组件。

不仅如此,有时"和前一个组件/[SM_g]word[SM_h]之前最多会有一个空格。

例如:

[SM_g]word[SM_h] ".

[SM_g]word[SM_h][SM_l] ".

等等。等等

我正在尝试通过移动核心字符串内的三个组件中的每一个来处理此字符串(并保留空格,以防在 &\quot; 和前一个组件/[SM_g]word[SM_h ])。

例如,[SM_g]word[SM_h].[SM_l]" 会变成

[SM_g]word.[SM_l]"[SM_h]

[SM_g]word[SM_h]"[SM_l]. 会变成

[SM_g]word"[SM_l].[SM_h]

或者,模拟在"之前有一个空格

[SM_g]word[SM_h] ".

会变成

[SM_g]word ".[SM_h]

等等。

我尝试了几种正则表达式组合,但都没有奏效。

有人有什么建议吗?

【问题讨论】:

  • 您可以将& 更改为& 以获得您想要的格式。
  • 您可以将代码块用于文字代码:" 使用> 用于引用(普通文本),而不是用于代码

标签: javascript regex string


【解决方案1】:

如果有必要,您需要将每个组件放在一个分组结构中,最大匹配尝试为3

\[SM_g]word(\[SM_h])((?:\.|\[SM_l]| ?"){0,3})

如果word 不是常量或特定关键字,您可以将word 替换为.*?

然后在替换字符串中你应该这样做:

$1$3$2

var re = /(\[SM_g]word)(\[SM_h])((?:\.|\[SM_l]| ?"){0,3})/g;
var str = `[SM_g]word[SM_h][SM_l] ".`;

console.log(str.replace(re, `$1$3$2`));

【讨论】:

    【解决方案2】:

    这似乎适用于您的流程,换句话说,changing sub-string position

    (\[SM_g])([^[]*)(\[SM_h])((?=([,\.])|(\[SM_l])|( ?&\\?quot;)).*)?
    

    Demo,,, 其中所有子字符串被分别捕获到每个capture group 为您的post processing

    [SM_g] 被捕获到 group1word 到 group2[SM_h] 到 group3all trailing part 的字符串是到 group4[,\.] 到 group 5[SM_l] 到组6,“?&\\?quot;”到组7

    因此,group1~3core part,group4trailing part,用于检查是否存在尾随部分,group5~7sub-parts of group4,用于您的后期处理。

    因此,您可以通过replacing with captured groups按照您想要的顺序轻松匹配字符串的position changed output string,如下所示。

    \1\2\7\3 or $1$2$7$3  etc..
    

    要在 Javascript 中替换,请参阅这篇文章。 JS Regex, how to replace the captured groups only?

    但上面的正则表达式不够精确,因为它可能允许任何repeatitions of the sub-part 的尾随字符串,例如\1\2\3\5\5\5\5\1\2\3\6\7\7\7\7\5\5\5 等。

    为了避免这种情况,它需要采用只接受可能的combinations 尾随字符串子部分的条件。请参考这个例子。 https://regex101.com/r/6aM4Pv/1/ 表示顺序中可能的combinations

    但是如果正则表达式采用allowing only possible combinations的条件,那么正则表达式会更复杂,所以我留下上面简化的正则表达式来帮助你理解它。谢谢:-)

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      相关资源
      最近更新 更多