Powershell拆分中的正则表达式

时间:2018-11-27 21:09:02

标签: regex powershell powershell-v2.0 powershell-v3.0 regex-lookarounds

我需要根据输入将UNC fqdn名称分解为仅名称或IP。

我的例子是

\\tom.overflow.corp.com
\\123.43.234.23.overflow.corp.com

我只想结束tom123.43.234.23

我的数组中包含以下代码,该代码可以完美地去除域名,但是我仍然留下\\tom

-Split '\.(?!\d)')[0]

4 个答案:

答案 0 :(得分:2)

我正在偷Lee_Dailey s $InSTuff 但附加一个RegEx I used recently

$InStuff = -split @'
\\tom.overflow.corp.com
\\123.43.234.23.overflow.corp.com
'@
$InStuff |ForEach-Object {($_.Trim('\\') -split '\.(?!\d{1,3}(\.|$))')[0]}

样本输出:

tom
123.43.234.23

正如您在RegEx101上看到的那样,数字之间的点是不匹配

答案 1 :(得分:2)

您的正则表达式原则上可以成功分割出感兴趣的令牌,但是它不能说明输入字符串中的前导\\

您可以使用正则表达式替换(|),将开头的\\作为附加的-split分隔符

鉴于在输入的开头匹配一个分隔符会创建一个索引为0 empty 元素,然后您需要访问索引1来获取兴趣。

简而言之:传递给-split的正则表达式应该是'^\\\\|\.(?!\d)'而不是'\.(?!\d)',用于访问结果数组的索引应该是[1]而不是{{ 1}}:

[0]

以上结果:

'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' | 
  ForEach-Object { ($_ -Split '^\\\\|\.(?!\d)')[1] }

或者,您可以使用tom 123.43.234.23 在单独的步骤中删除开头的\\

-replace

另一种选择是使用单个'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' | ForEach-Object { ($_ -Split '\.(?!\d)')[0] -replace '^\\\\' } 操作,该操作不需要进行-replace通话 (不需要显式的迭代):

ForEach-Object
  • 内联选项'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' -replace '?(x) ^\\\\ (.+?) \.\D .+', '$1' (?x))使您可以使用微不足道的空格使正则表达式更具可读性:任何未转义的空格都可以用于可视化格式。

  • IgnoreWhiteSpace与每个字符串的开头(^\\\\)的\\(用\跳出)匹配。

  • ^延迟匹配一个或多个字符。

  • (.+?)匹配文字\.\D,后跟除数字之外的其他 .匹配数字,\d是否定)。

  • \D匹配一个或多个剩余字符,即其余输入。

  • .+作为替换操作数指的是正则表达式中的第一个捕获组($1)匹配的内容,并且鉴于正则表达式旨在使用整个字符串,因此将其替换就这样。

答案 2 :(得分:1)

Select-String函数使用正则表达式,并用匹配项填充public class AlertJob extends JobIntentService { public static void enqueueWork(Context context, Intent work) { enqueueWork(context, AlertJob.class, 123, work); } @Override public void onCreate() { super.onCreate(); } @Override protected void onHandleWork(@NonNull Intent intent) { try { Thread.sleep(5000); startService(new Intent(getApplicationContext(), Service_Notification.class)); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void onDestroy() { super.onDestroy(); } @Override public boolean onStopCurrentWork() { return super.onStopCurrentWork(); } }对象(然后可以查询)。

正则表达式MatchInfo适用于您的特定示例。

"(\.?\d+)+|\w+"

答案 3 :(得分:0)

虽然这不是正则表达式,但它确实起作用。 [咧嘴]我怀疑如果您有大量此类物品,那么您将需要正则表达式。它们的确比简单的文本运算符要快。

这将删除前导\\,然后将域名替换为。

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = -split @'
\\tom.overflow.corp.com
\\123.43.234.23.overflow.corp.com
'@

$DomainName = '.overflow.corp.com'

$InStuff.ForEach({
    $_.TrimStart('\\').Replace($DomainName, '')
    })

输出...

tom
123.43.234.23