相关疑难解决方法(0)

用于查找最多n个连续模式的正则表达式

让我们说我们的模式是大写字母的正则表达式(但我们可能有比搜索大写更复杂的模式)

至少要找到 n个连续模式(在这种情况下,我们正在寻找的模式只是一个大写字母),我们可以这样做:

(使用Ruby)

somestring = "ABC deFgHij kLmN pQrS XYZ abcdEf"

at_least_2_capitals = somestring.scan(/[A-Z][A-Z]+/)
=> ["ABC", "XYZ"]
at_least_3_capitals = somestring.scan(/[A-Z]{3}[A-Z]*/)
=> ["ABC", "XYZ"]
Run Code Online (Sandbox Code Playgroud)

但是,如何搜索最多 n个连续模式,例如,最多连续一个大写字母:

matches = somestring.scan(/ ??? /)
=> [" deFgHij kLmN pQrS ", " abcdEf"]
Run Code Online (Sandbox Code Playgroud)

详细的策略

我读到我需要否定"至少"正则表达式,将其变为DFA,否定接受状态,(然后将其转换回NFA,尽管我们可以保留原样),所以将其写为正则表达式.如果我们将我们的模式看作接收'1'并且没有接收到接收'0'的模式,我们可以绘制一个简单的DFA图(其中n = 1,我们最多想要一个模式):

DFA_to_be_regexed

具体来说,我想知道这是如何成为一个正则表达式.一般来说,我希望找到如何用正则表达式找到"最多",因为我的正则表达式技能感到特别"至少"单独发痒.


旅行危险 - 在精神上不是正确的解决方案

请注意,这个问题不是这篇文章的重复,因为使用公认的方法会给出:

somestring.scan(/[A-Z]{2}[A-Z]*(.*)[A-Z]{2}[A-Z]*/)
=> [[" deFgHij kLmN pQrS X"]]
Run Code Online (Sandbox Code Playgroud)

这不是DFA所展示的,不仅仅是因为它错过了第二次寻求的匹配 - 更重要的是,它包括'X',它不应该,因为'X'后面是另一个资本,而且从DFA我们看到一个资本,其次是另一个资本,不是接受国.

你可以建议

somestring.split(/[A-Z]{2}[A-Z]*/)
=> ["", " deFgHij kLmN pQrS ", " abcdEf"]
Run Code Online (Sandbox Code Playgroud)

(感谢橡皮鸭)

但我仍然想知道如何仅使用正则表达式找到最多n次出现.(知识!)

ruby regex

5
推荐指数
1
解决办法
1063
查看次数

正则表达式仅捕获匹配中捕获组的最后一个实例

我有两种不同语言的正则表达式,它们产生相同的奇数结果(javaScript和Flash).我想知道的不是如何解决它,而是为什么会发生这种行为?

正则表达式:

\[(\\{2}|\\\]|[^\]])*\]
Run Code Online (Sandbox Code Playgroud)

这里的目标是匹配一个括号中的字符串,并确保我不会停留在转义括号中.

如果我有文本输入[abcdefg]它是正确匹配的,但作为捕获组的一部分返回的唯一内容是g,在我期望的位置abcdefg.如果我将表达式更改为 \[((?:\\{2}|\\\]|[^\]])*)\],那么我得到我想要的结果.

那为什么会这样呢?这会在其他语言中保持一致吗?

注意:简化表达式以\[([^\]])*\]产生相同的问题.

javascript regex actionscript-3 capturing-group ecmascript-5

5
推荐指数
1
解决办法
6603
查看次数

正则表达式匹配引号中带有双引号的字符串

我面临着以下列格式匹配输入的挑战:

  • 输入由键=值对组成.关键始于斜线.该值可以是引号中的数字或字符串.
  • 该值可以选择包含转义引号,即引号后跟引号("").这种逃逸的报价应被视为价值的一部分.无需检查转义的报价是否平衡(例如,以另一个转义报价结束).

正则表达式应该与序列的给定key = value部分匹配,并且不应该为长输入中断(例如,值为10000个字符).

首先我来到这个解决方案:

/(\w+)=(\d+|"(?:""|[^"])+"(?!"))
Run Code Online (Sandbox Code Playgroud)

并且它执行得不错,但是在Java6中,对于长输入(例如,cashes regexplanet),StackOverflowError失败了.我尝试改进它以便更快地运行:

/(\w+)=(\d+|"(?:""|[^"]+)+"(?!"))
Run Code Online (Sandbox Code Playgroud)

但是如果输入不匹配,它会在回溯中进入无限循环,试图匹配它.

然后我来到这个正则表达式:

/(\w+)=(\d+|".+?(?<!")(?:"")*"(?!"))
Run Code Online (Sandbox Code Playgroud)

表现较慢,但它似乎解决了这个任务.

任何人都可以建议更好/更快的正则表达式?

样本输入:

/mol_type="protein" /transl_table=11 /note="[CDS] (""multi
line)"  nn  /organism="""Some"" Sequence" nn  /organism="Some ""Sequence"""
/translation="MHPSSSRIPHIAVVGVSAIFPGSLDAHGFWRDILSGTDLITDVPSTHWLVE
DYYDPDPSAPDKTYAKRGAFLKDVPFDPLEWGVPPSIVPATDTTQLLALIVAKRVLEDAAQGQFE
SMSRERMSVILGVTSAQELLASMVSRIQRPVWAKALRDLGYPEDEVKRACDKIAGNYVPWQESSF
PGLLGNVVAGRIANRLDLGGTNCVTDAACASSLSAMSMAINELALGQSDLVIAGGCDTMNDAFMY
MCFSKTPALSKSGDCRPFSDKADGTLLGEGIAMVALKRLDDAERDGDRVYAVIRGIGSSSDGRSK
SVYAPVPEGQAKALRRTYAAAGYGPETVELMEAHGTGTKAGDAAEFEGLRAMFDESGREDRQWCA
LGSVKSQIGHTKAAAGAAGLFKAIMALHHKVLPPTIKVDKPNPKLDIEKTAFYLNTQARPWIRPG
DHPRRASVSSFGFGGSNFHVALEEYTGPAPKAWRVRALPAELFLLSADTPAALADRARALAKEAE
VPEILRFLARESVLSFDASRPARLGLCATDEADLRKKLEQVAAHLEARPEQALSAPLVHCASGEA
PGRVAFLFPGQGSQYVGMGADALMTFDPARAAWDAAAGVAIADAPLHEVVFPRPVFSDEDRAAQE
ARLRETRWAQPAIGATSLAHLALLAALGVRAEAFAGHSFGEITALHAAGALSAADLLRVARRRGE
LRTLGQVVDHLRASLPAAGPAASASPAAAASVPKASTAAVPAVASVAAPGAAEVERVVMAVVAET
TGYPAEMLGLQMELESDLGIDSIKRVEILSAVRDRTPGLSEVDASALAQLRTLGQVVDHLRASLP
AASAGPAVAAPAAKAPAVAAPTGVSGATPGAAEVERVVMAVVAETTGYPAEMLGLQMELESDLGI
DSIKRVEILSAVRDRTPGLAEVDASALAQLRTLGQVVDHLRASLGPAAVTAGAAPAEPAEEPAST
PLGRWTLVEEPAPAAGLAMPGLFDAGTLVITGHDAIGPALVAALAARGIAAEYAPAVPRGARGAV
FLGGLRELATADAALAVHREAFLAAQAIAAKPALFVTVQDTGGDFGLAGSDRAWVGGLPGLVKTA
ALEWPEASCRAIDLERAGRSDGELAEAIASELLSGGVELEIGLRADGRRTTPRSVRQDAQPGPLP
LGPSDVVVASGGARGVTAATLIALARASHARFALLGRTALEDEPAACRGADGEAALKAALVKAAT
SAGQRVTPAEIGRSVAKILANREVRATLDAIRAAGGEALYVPVDVNDARAVAAALDGVRGALGPV
TAIVHGAGVLADKLVAEKTVEQFERVFSTKVDGLRALLGATAGDPLKAIVLFSSIAARGGNKGQC
DYAMANEVLNKVAAAEAARRPGCRVKSLGWGPWQGGMVNAALEAHFAQLGVPLIPLAAGAKMLLD
ELCDASGDRGARGQGGAPPGAVELVLGAEPKALAAQGHGGRVALAVRADRATHPYLGDHAINGVP
VVPVVIALEWFARAARACRPDLVVTELRDVRVLRGIKLAAYESGGEVFRVDCREVSNGHGAVLAA
ELRGPQGALHYAATIQMQQPEGRVAPKGPAAPELGPWPAGGELYDGRTLFHGRDFQVIRRLDGVS
RDGIAGTVVGLREAGWVAQPWKTDPAALDGGLQLATLWTQHVLGGAALPMSVGALHTFAEGPSDG
PLRAVVRGQIVARDRTKADIAFVDDRGSLVAELRDVQYVLRPDTARGQA"
/note="primer of  Streptococcus pneumoniae
Run Code Online (Sandbox Code Playgroud)

预期输出(来自regexhero.net):

正则表达式

java regex java-6

5
推荐指数
1
解决办法
1408
查看次数

RegEx:紧接在最后一个打开的括号之后的文本

我对RegEx有一点了解,但此刻,它远远超出了我的能力.

我需要帮助才能在最后一个没有匹配括号的开括号之后立即找到文本/表达式.

这是开发中的开源软件(Object Pascal)的CallTip.

下面是一些例子:

------------------------------------
Text                  I need
------------------------------------
aaa(xxx               xxx
aaa(xxx,              xxx
aaa(xxx, yyy          xxx
aaa(y=bbb(xxx)        y=bbb(xxx)
aaa(y <- bbb(xxx)     y <- bbb(xxx)
aaa(bbb(ccc(xxx       xxx
aaa(bbb(x), ccc(xxx   xxx
aaa(bbb(x), ccc(x)    bbb(x)
aaa(bbb(x), ccc(x),   bbb(x)
aaa(?, bbb(??         ??
aaa(bbb(x), ccc(x))   ''
aaa(x)                ''
aaa(bbb(              ''
------------------------------------

For all text above the RegEx proposed by @Bohemian
(?<=\()(?=([^()]*\([^()]*\))*[^()]*$).*?(?=[ ,]|$)(?! <-)(?<! <-)
matches all cases.

For the below (I found these cases when implementing the RegEx in the software) not
------------------------------------
New …
Run Code Online (Sandbox Code Playgroud)

regex delphi

4
推荐指数
1
解决办法
278
查看次数

在Perl中围绕外部字符分裂.组内的最小假设

我很难将此线程中的答案适应以下问题:

我想拆分以下字符串:

my $string = "foo{age}, bar{height}. something_else. baz{weight,so='yes',brothers=john.smith}.test{some}"
Run Code Online (Sandbox Code Playgroud)

外面的点周围.结果应该是数组保持

("foo{age}, bar{height}", 
 "foo{weight,parents='yes',brothers=john.smith}", 
 "test{some}")
Run Code Online (Sandbox Code Playgroud)

我想避免对组内部的内容做出假设{}.

我怎么能在Perl中做到这一点?

我尝试调整以下内容:

print join(",",split(/,\s*(?=\w+{[a-z,]+})/g, $string));
Run Code Online (Sandbox Code Playgroud)

通过替换字符类中的内容[]而不成功.

更新:

唯一的字符不是一个内不允许{}组是{}

regex perl

3
推荐指数
1
解决办法
77
查看次数

是否有能够解析匹配符号的正则表达式?

这个正则表达式

/\(.*\)/
Run Code Online (Sandbox Code Playgroud)

将不匹配匹配的括号,但匹配字符串中的最后一个括号.是否有正则表达式扩展或类似的东西,具有适当的语法允许这个?例如:

there are (many (things (on) the)) box (except (carrots (and apples)))
Run Code Online (Sandbox Code Playgroud)

/OPEN(.*CLOSE)/ 应该匹配 (many (things (on) the))

可能有无限级别的括号.

regex string parsing

1
推荐指数
1
解决办法
578
查看次数