需要正则表达式模式才能在文本开头的分隔符之间获取文本

Need RegEx Pattern to get text between delimiters at start of text

我的源文本可以是行首“[”和“]”之间的任意数量的字符。我只有一根线。 例如:

 [1] and some other text here
 [10] more text, but maybe some brackets [KEY]
 [1000000] a lot more text

我想要match/return“[”和“]”之间的文本。


提供答案后编辑

@nickb 提供的第一个答案对我有用 这个 AppleScript: 请注意,我必须将 RegEx 转换为带引号的字符串才能在 AS 中使用。这使用 Satimage AppleScript Additions find text 命令,它为 AppleScript 提供 RegEx 引擎。

set strRegEx to "^\[(.*?)\]" -- Original: "^\[(.*?)\]"

set strTextToSearch to "[10] My Note title with [KEY] "
set strCaptureGroup to find text strRegEx in strTextToSearch using {"\1"} with regexp and string result
log strCaptureGroup

-->10

您可以使用的最简单的正则表达式如下:

^\[(.*?)\]

您可以看到它与您的输入匹配 here

我认为这符合您的标准:

^\[([^]]*)\].*

返回第一个匹配组中括号中的内容。

您可以尝试运行以下reg。 exp.每行:

[^\[]\w+[^\]]

我在regex101测试了它,它与[]里面的内容匹配,不包括括号。

/^\[(.*?)\]/

这种情况下最简单的正则表达式,但它也匹配周围的括号。
精确值(不带括号)存储在 1st capture group.

如果你不想匹配括号,你需要这个:

/(?<=^\[).*?(?=\])/

…除非你使用JavaScript——不幸的是,JS 不支持lookbehinds

在这种情况下,您将需要此正则表达式:

/^[^\[\]]+/

(假设每个输入都会以[…]组件开始,并且不会为空)

要使用的正则表达式取决于您将如何使用它来解析输入。这里的一些答案有尾随 .* 而有些则没有。两者都是正确的,这仅取决于您要匹配的确切内容,以及至关重要的是您如何询问匹配项。例如,在 Java 中,使用正则表达式 ^\[(.*?)\],如果您将整个字符串“[1000000] 更多文本”输入它并调用 matches(),它将 return false 因为正则表达式模式不考虑括号外的任何尾随文本。但是,如果您在输入同一字符串后调用 find(),它将匹配,因为 find() 在解析时作用于每个子字符串,并且在它命中的第一个匹配项上 return 为真,而 matches() 仅当整个输入与正则表达式匹配时才 return 为真。每次调用 find() 时,find() 还将在字符串中查找与正则表达式匹配的后续子字符串,直到解析器到达输入的末尾。

就个人而言,我喜欢使用正则表达式来解释整个输入,并使用捕获组来隔离我想从输入中获取的实际文本。但是您的里程可能会有所不同。

或者纯 AppleScript 解决方案

set theText to "[1] and some other text here
[10] more text, but maybe some brackets [KEY]
[1000000] a lot more text"

set resultList to {}
set {TID, text item delimiters} to {text item delimiters, "]"}
repeat with aLine in (get paragraphs of theText)
    if aLine starts with "[" then set end of resultList to text 2 thru -1 of text item 1 of aLine
end repeat
set text item delimiters to TID

resultList -- {"1", "10", "1000000"}