我的源文本可以是行开头的“[”和“]”之间的任意数量的字符。我只有一行。 例如:
[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
答案 0 :(得分:2)
答案 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)
答案 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()
也会发现字符串中正则表达式的后续子字符串匹配,直到解析器到达输入的末尾。
就个人而言,我喜欢使用占整个输入的正则表达式,并使用捕获组来隔离我想从输入中获取的实际文本。但你的里程可能会有所不同。