需要RegEx Pattern才能在文本开头处在分隔符之间获取文本

时间:2015-12-18 02:11:27

标签: regex applescript

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

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

我想在“[”和“]”之间匹配/返回文本。

提供答案后编辑

@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

6 个答案:

答案 0 :(得分:2)

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

^\[(.*?)\]

您可以看到它与您的输入here相符。

答案 1 :(得分:2)

另一种纯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"}

答案 2 :(得分:0)

我认为这符合您的标准:

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

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

答案 3 :(得分:0)

您可以尝试运行以下注册表。进出口。在每一行:

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

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

答案 4 :(得分:0)

/^\[(.*?)\]/
对于这种情况,

really最简单的正则表达式,但它也与周围的括号匹配 确切的值(不带括号)存储在1st capture group

如果您不想匹配括号,则需要:

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

...除非你使用JavaScript - 不幸的是,JS不支持lookbehinds

在这种情况下,你需要这个正则表达式:

/^[^\[\]]+/

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

答案 5 :(得分:0)

要使用的正则表达式取决于您将如何使用它来解析它的输入。这里的一些答案有一个尾随。*有些则没有。两者都是正确的,它只取决于你想要匹配的内容,而且至关重要的是你如何询问比赛。例如,在Java中,使用正则表达式((DataTable)dataGridView1.DataSource).DefaultView.RowFilter = "FirstName = 'John'"; ,如果您将整个字符串&#34; [1000000]提供更多文本&#34;并调用^\[(.*?)\],它将返回false,因为正则表达式模式不考虑括号外的任何尾随文本。但是,如果您在输入相同的字符串后调用matches(),它将匹配,因为find()在解析时对每个子字符串起作用,并且在它命中的第一个匹配时返回true,而find()只有在整个输入与正则表达式匹配时才会返回true。每次调用matches()时,find()也会发现字符串中正则表达式的后续子字符串匹配,直到解析器到达输入的末尾。

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