需要正则表达式模式才能在文本开头的分隔符之间获取文本
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"}
我的源文本可以是行首“[”和“]”之间的任意数量的字符。我只有一根线。 例如:
[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"}