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

时间:2018-04-19 03:36:59

标签: javascript regex string

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

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

注意短语" [SM_g]字[Sm_h]"之后的字符串。有三个组成部分:

  1. 句号(。)这也可以是逗号(,)
  2. [SM_l]
  3. "
  4. 所有这三个组件中的零到将始终出现在" [SM_g]字[SM_h]"之后。但是,它们也可以在" [SM_g]字[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]"这三个组件可以按任何顺序,有时一个,两个或所有三个组件都将丢失。

    不仅如此,有时候在#34;之前会有一个空格。和前一个组件/ [SM_g]字[SM_h]。

    例如:

    [SM_g]word[SM_h] ".

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

    等。等

    我试图通过移动核心字符串中的三个组件来处理这个字符串(并保留空格,以防在& \ quot之前有空格和前一个组件/ [SM_g]字[ 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]

    等等。

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

    有人有建议吗?

2 个答案:

答案 0 :(得分:1)

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

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

如果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`));



func sortMediaToCategories(media items: [StoryData.Items], success: @escaping (() -> Void), failure: @escaping (() -> Void)) {

    let group = DispatchGroup()

    for item in items {
        if item.media_type == 1 {
            guard let url = URL(string: (item.image_versions2?.candidates?.first!.url)!) else { break }

            group.enter()
            mediaToStorageDistribution(withImageUrl: url,
                                       videoUrl: nil,
                                       mediaType: .jpg,
                                       takenAt: item.taken_at,
                                       success: { group.leave() },
                                       failure: {
                                          print("error")
                                          group.leave()
            })
        }
     }

    group.notify(queue: .main) {
        self.collectionView.reloadData()
    }
 }




答案 1 :(得分:0)

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

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

Demo ,,,分别为capture group每个post processing捕获所有子字符串。

[SM_g]被捕获到群组1word群组2[SM_h]群组3和{{1}字符串将} all trailing part4分组到[,\.]5分组到[SM_l]," 6"分组?&\\?quot;

因此,组71~3,组core part4,用于检查尾随部分是否存在,而组trailing part5~7为你的后期处理。

因此,您可以按照sub-parts of group4的顺序轻松匹配字符串position changed output string,如下所示。

replacing with captured groups

要在Javascript中替换,请参阅此帖子。 JS Regex, how to replace the captured groups only?

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

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

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