我需要根据输入将UNC fqdn名称分解为仅名称或IP。
我的例子是
\\tom.overflow.corp.com
\\123.43.234.23.overflow.corp.com
我只想结束tom
或123.43.234.23
我的数组中包含以下代码,该代码可以完美地去除域名,但是我仍然留下\\tom
-Split '\.(?!\d)')[0]
答案 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