【问题标题】:How can i get all get substring from a complex string using regex or any other solution? [duplicate]如何使用正则表达式或任何其他解决方案从复杂字符串中获取所有子字符串? [复制]
【发布时间】:2020-01-20 14:02:13
【问题描述】:

输入应该是这样的:

class1{name=‘adam.smith’}.class2{name=‘john’}.subjectMath

输出类似:

["class1{name='adam.smith'}", "class2{name='john'}", "subjectMath"]

有什么办法吗?

【问题讨论】:

  • 为什么要标记多种语言?
  • 您对输入有任何控制权吗?如果你这样做,我强烈建议你切换到某种标准化序列化(YAML、JSON、XML、CSV 等)

标签: javascript swift regex regex-group


【解决方案1】:

尝试使用split

var input = "class1{name=‘adam.smith’}.class2{name=‘john’}.subjectMath";
var parts = input.split(/\.(?![^{]*’)/);
console.log(parts);

用于拆分的正则表达式需要一些解释:

\.          match a literal dot
(?![^{]*’)  but assert that we DON'T encounter a text curly quote
            looking forward so long as we don't hit a { first

负前瞻使adam.smith 中的点失败,因为我们可以在不遇到{ 左括号的情况下找到花引号,这意味着点不是连接点。

【讨论】:

  • 它不起作用,它实际上是拆分名称,因为那里也有一个点
  • @MickaelB。我修好了它。抱歉,我没有意识到您的数据中可能包含点。
【解决方案2】:

像这样刺痛:

string = "class1{name=‘adam.smith’}.class2{name=‘john’}.subjectMath";

你可以试试这个:

string.split(/(?<=})./)

将返回:

[ "class1{name=‘adam.smith’}" , "class2{name=‘john’}" , "subjectMath" ]

【讨论】:

  • 并非所有版本的 JavaScript 都支持后视。
  • 是的,当然,我假设它确实支持。
【解决方案3】:

斯威夫特 5.1

这是 Swift 的一个解决方案,假设输入结构保持不变,括号在点之前:

var input = "class1{name=‘adam.smith’}.class2{name=‘john’}.subjectMath"

func splittingClasses(_ input: String) -> [String] {
    var total: [String] = []
    var parts = input.components(separatedBy: "}.")
    let endpart =  "}"
    for i in 0 ..< parts.count {
        if i == parts.count - 1 {
            total.append(parts[i])
        } else {
            total.append(parts[i] + endpart)
        }
    }
    print(total)
    return total
}
splittingClasses(input) 
// returns ["class1{name=‘adam.smith’}", "class2{name=‘john’}", "subjectMath"]

【讨论】:

  • input.components(separatedBy: "}.").joined(separator: "}")
【解决方案4】:

您可以匹配不是. 的所有内容,当然这会给‘...’ 上下文中的. 带来一些问题。出于这个原因,我们也应该匹配那些。

const input = "class1{name=‘adam.smith’}.class2{name=‘john’}.subjectMath";
const output = input.match(/(?:‘[^’]*’|[^.])+/g);

console.log(output);
‘[^’]*’

将匹配任何 并继续匹配,直到找到结束的 字符,匹配中间的任何字符。

[^.]

将匹配任何不是. 字符的内容。

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多