小编Mar*_*der的帖子

用powershell中的正则表达式替换文本文件的内容

我有一个简单的文本文件,我需要一个powershell脚本来替换文件内容的某些部分.

我目前的脚本如下:

$content = Get-Content -path "Input.json"

$content -Replace '"(\d+),(\d{1,})"', '$1.$2' |  Out-File "output.json"
Run Code Online (Sandbox Code Playgroud)

是否可以在没有内容变量的情况下将其写入一行,如下所示?

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' |  Out-File "output.json"
Run Code Online (Sandbox Code Playgroud)

我不知道如何在没有$ content变量的情况下在第二个命令中使用第一个get-content命令行开关的输出?是否有自动PowerShell变量

是否有可能比管道中的替换更多.

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' |  Out-File "output.json"
Run Code Online (Sandbox Code Playgroud)

regex powershell

38
推荐指数
2
解决办法
4万
查看次数

为什么这种反向引用在外观中不起作用?

在正则表达式中匹配重复的字符很简单,使用反向引用:

(.)\1
Run Code Online (Sandbox Code Playgroud)

在这里测试一下.

但是,我想这对角色之后匹配角色,所以我想我可以简单地将它放在一个后视镜中:

(?<=(.)\1).
Run Code Online (Sandbox Code Playgroud)

不幸的是,这与任何事情都不相符.

这是为什么?在其他方面,我不会感到惊讶,因为对lookbehinds有强烈的限制,但.NET通常支持lookbehinds中任意复杂的模式.

.net regex regex-lookarounds

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

PowerShell的管道增加了换行

我正在尝试将一个字符串传递给程序的STDIN 而没有任何尾随换行符(除非该字符串本身实际上以换行符结束).我试过谷歌搜索,但我只发现有人试图打印到控制台没有拖尾换行,在这种情况下Write-Host需要一个参数-NoNewLine.但是,要将它传输到另一个程序,我需要Write-Output或类似的没有这样的参数.现在似乎Write-Output甚至不是问题:

Z:\> (Write-Output "abc").Length
3
Run Code Online (Sandbox Code Playgroud)

但是,只要我将它传送到另一个程序并在那里读取字符串,我就会得到一个额外的换行符.例如,我尝试了这个Ruby片段:

Z:\> Write-Output "abc" | ruby -e "p ARGF.read"
"abc\n"
Run Code Online (Sandbox Code Playgroud)

我检查了收到的实际字符串是abc\n.其他几种语言(至少是C#,Java和Python)也是如此,所以我认为这是PowerShell的一个问题,而不是阅读的语言.

作为进一步的测试,我Write-Output用另一个Ruby脚本替换自己:

Z:\> ruby -e "$> << 'abc'"
abcZ:\>
Run Code Online (Sandbox Code Playgroud)

(也就是说,\n脚本的STDOUT 肯定没有.)

但是,当我将它传递到另一个脚本时:

Z:\> ruby -e "$> << 'abc'" | ruby -e "p ARGF.read"
"abc\n"
Run Code Online (Sandbox Code Playgroud)

我相信它是添加换行的管道.我该如何避免?我实际上希望能够控制输入是否以换行结束(通过将其包含在输入中或省略它).

(作为参考,我还测试了已包含尾随换行符的字符串,在这种情况下,管道不会添加另一个换行符,所以我猜它只是确保拖尾换行符.)

我最初在PowerShell v3中遇到过这种情况,但我现在正在使用v5,但仍然存在同样的问题.

powershell stdin io-redirection linefeed

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

在可变长度的后视中平衡组

TL; DR:在.NET的lookbehinds中使用捕获(特别是平衡组)会改变获得的捕获,尽管它不应该有所作为.什么是.NET的外观打破了预期的行为?

我试图找到另一个问题的答案,作为借助.NET平衡组的借口.但是,我不能让他们在可变长度的lookbehind内工作.

首先,请注意我并不打算高效地使用这个特定的解决方案.这更多是出于学术原因,因为我觉得可变长度的lookbehind有一些我不知道的事情.并且知道这可能在将来派上用场,当我真的需要使用这样的东西来解决问题时.

考虑这个输入:

~(a b (c) d (e f (g) h) i) j (k (l (m) n) p) q
Run Code Online (Sandbox Code Playgroud)

我们的目标是匹配所有的字母,这是由前括号内~,没有多么深跌(所以一切从ai).我的尝试是检查后视镜中的正确位置,以便我可以通过一次调用获得所有字母Matches.这是我的模式:

(?<=~[(](?:[^()]*|(?<Depth>[(])|(?<-Depth>[)]))*)[a-z]
Run Code Online (Sandbox Code Playgroud)

在lookbehind我尝试找到一个~(,然后我使用命名组堆栈Depth来计算无关的开括号.只要打开的括号~(永远不会关闭,那么lookbehind应该匹配.如果到达(?<-Depth>...)那个右括号,则无法从堆栈中弹出任何内容,并且lookbehind应该失败(即,对于所有来自的字母j).不幸的是,这不起作用.相反,我匹配a,b,c,e,f,gm.所以只有这些:

~(a b (c) _ (e f (g) _) _) _ (_ (_ (m) _) _) _
Run Code Online (Sandbox Code Playgroud)

这似乎意味着,一旦我关闭了一个单一的括号,看起来就无法匹配任何东西,除非我回到我以前最高的嵌套水平.

好吧,这可能只是意味着我的正则表达式有些奇怪,或者我没有正确理解平衡组.但后来我尝试了这个没有外观.我为每个字母创建了一个字符串,如下所示:

~(z …
Run Code Online (Sandbox Code Playgroud)

.net regex lookaround balancing-groups

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

我们需要什么Lookahead/Lookbehind Zero Width Assertions?

我刚刚更详细地了解了这两个概念.我一直对RegEx很好,似乎我从未见过需要这两个零宽度断言.

我很确定我错了,但我不明白为什么需要这些结构.考虑这个例子:

Match a 'q' which is not followed by a 'u'.
Run Code Online (Sandbox Code Playgroud)

将输入2个字符串:

Iraq
quit
Run Code Online (Sandbox Code Playgroud)

使用负向前瞻,正则表达式如下所示:

q(?!u)
Run Code Online (Sandbox Code Playgroud)

没有它,它看起来像这样:

q[^u]
Run Code Online (Sandbox Code Playgroud)

对于给定的输入,这两个正则表达式给出相同的结果(即匹配Iraq但不是quit)(用perl测试).同样的想法适用于lookbehinds.

我错过了一个关键特性,使这些断言比经典语法更有价值吗?

regex regex-lookarounds

10
推荐指数
2
解决办法
2060
查看次数

什么"(?x ::"表示在Boost正则表达式替换中,"x"是一个数字?

这是在Sublime Text 2的Ruby包中的一个片段文件中找到的Perl样式的正则表达式:

/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g
Run Code Online (Sandbox Code Playgroud)

我知道它将像"some_class.rb"这样的文件名转换为"SomeClass",但我无法弄清楚这部分是做什么的:(?2::.Sublime Text 2使用boost作为其正则表达式,所以我检查了Boost-Extended Format String Syntax的文档,我发现boost支持格式字符串(f.inst.(?2(foo):(bar)))中的条件,但你永远不需要两个冒号.另外,?2将指向第二个子表达式,但上面的表达式只匹配一个子表达式.出于这些原因,我不认为这是一个条件表达式.

感谢任何有启发性的答案.

regex boost sublimetext2

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

如何从带有模式/过滤器的目录中获取文件

我必须从PDF文件目录中获取文件.我有问题,我没有一个字段来整合所有数据来查找文件.

这是一个例子:

文件名:

Comp_20120619_170310_2_632128_FC_A_8_23903.pdf
Run Code Online (Sandbox Code Playgroud)

文件名生成:

Comp_20120619_--------_2_632128_FC_A_8_23903.pdf
Run Code Online (Sandbox Code Playgroud)

我没有'字段"--------"使文件COMPLETE名称.

我正在尝试,File.list但我找不到正确的文件.

java regex directory file filter

7
推荐指数
1
解决办法
2万
查看次数

Magento - 在后端获取默认商店代码

我试图从Magento的后端找到默认的商店代码.虽然这听起来很简单,但我找不到任何解决方案.

我找到的片段也是

Mage::app()->getStore()->getCode()
Run Code Online (Sandbox Code Playgroud)

(虽然这不符合默认值但对应当前商店)或

Mage::app()->getStore(Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID)->getCode();
Run Code Online (Sandbox Code Playgroud)

但是从后端内部这些只返回"admin"(因为后端被视为某种特殊商店,商店ID为0 - 这是值DEFAULT_STORE_ID).有谁可以请我指出从任何地方获取实际默认商店代码的方法?(由Magento的设置如果"添加商店代码到URL"和"自动重定向到基本URL"选项被激活,那家商店代码)

我只需要一些背景知识:我需要在Magento配置中生成一个URL,如果激活了"向URL添加存储代码",它仍然有效.我可以设置任何商店代码,所以如果我在其中一个的配置范围内,我可以使用那个.但是,如果配置范围设置为默认或网站,它也必须工作,我想在这种情况下使用默认的商店代码.

提前致谢!

编辑:我找到了一个解决方案:

$websites = Mage::app()->getWebsites();
$code = $websites[1]->getDefaultStore()->getCode();
Run Code Online (Sandbox Code Playgroud)

但是,这给我留下了一些后续问题.

为什么Mage::app()->getWebsite()返回一个只包含特殊admin商店的特殊网站对象,同时Mage::app()->getWebsites()返回一个包含通常的前端网站的数组,而不是返回的对象getWebsite()

为什么前端网站对象占用数组中的索引1,而索引0未使用?我真的很想知道在那里使用幻数的原因(如果必须的话).

php magento magento-1.x

6
推荐指数
2
解决办法
2万
查看次数

谷歌分析正则表达 - 替代没有负面前瞻

Google Analytics不再允许在其过滤器中使用否定前瞻功能.事实证明,创建自定义报告非常困难,只包括我希望包含的链接.

包含负向前瞻的正则表达式如果启用它将起作用:

test.com(\/\??index\_(.*)\.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)
Run Code Online (Sandbox Code Playgroud)

匹配:

test.com
test.com/
test.com/index_fb2.php
test.com/index_fb2.php?ref=23
test.com/index_fb2.php?ref=23&e=35
test.com/?ref=23 
test.com/?ref=23&e=35
Run Code Online (Sandbox Code Playgroud)

并且不匹配(应该如此):

test.com/ambassadors
test.com/admin/?signup=true 
test.com/randomtext/
Run Code Online (Sandbox Code Playgroud)

我正在寻找如何调整我的正则表达式仍然保持相同的匹配,但没有使用负前瞻.

谢谢!

regex google-analytics

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

Oracle SQL - 从字符串中删除部分重复

我有一个表格,其中包含一个字符串,如下所示:

static-text-here/1abcdefg1abcdefgpxq
Run Code Online (Sandbox Code Playgroud)

从这个字符串1abcdefg重复两次,所以我想删除该部分字符串,并返回:

static-text-here/1abcdefgpxq
Run Code Online (Sandbox Code Playgroud)

我不能保证重复字符串的长度.在纯SQL中,如何执行此操作?

regex sql oracle

6
推荐指数
2
解决办法
3453
查看次数