我无法修剪字符串末尾的某些字符。字符串通常如下所示:
C:\blah1\blah2
但有时它看起来像:
C:\blah1\blah2.extra
我需要提取字符串'blah2'。大多数情况下,使用substring命令很容易。但是在极少数情况下,当存在'.extra'部分时,我需要首先修剪该部分。
问题是,'。extra'总是以点开头,但接着是不同长度的各种字母组合。所以通配符是必要的。基本上,我需要编写脚本,“如果字符串包含一个点,则修剪点和后面的任何内容。”
$string.replace(".*","")
不起作用。 $string.replace(".\*","")
也没有。 $string.replace(".[A-Z]","")
也没有。
另外,我也无法从字符串的开头得到它。 'blah1'未知且长度各异。我必须从字符串末尾处获得'blah2'。
答案 0 :(得分:5)
假设字符串始终是包含或不包含扩展名的文件的路径(例如“.extra”),您可以使用Path.GetFileNameWithoutExtension()
:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText stringtext; // final error here
stringtext = (EditText) findViewById(R.id.editText);
TextView textView2; // final error here
textView2 = (TextView) findViewById(R.id.textView2);
Button startprogram = (Button) findViewById(R.id.button);
View.OnClickListener listener = new View.OnClickListener(){
@Override
public void onClick(View view){
// Insert what you want the button to do here!
setContentView(R.layout.helloworld);
}
};
startprogram.setOnClickListener(listener);
// this is button to check the inserted code
Button checkbutton = (Button) findViewById(R.id.checkbutton);
View.OnClickListener listener1 = new View.OnClickListener(){
public void onClick(View view){
//insert button command here
textView2.setText(stringtext.getEditableText());
}
};
}
路径甚至不必植根:
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2")
blah2
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("C:\blah1\blah2.extra")
blah2
如果你想自己实现类似的功能,那也应该相当简单 - 使用PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("blah1\blah2.extra")
blah2
在字符串中找到 last String.LastIndexOf()
并使用它作为\
的起始参数:
Substring()
你会看到类似的结果:
function Extract-Name {
param($NameString)
# Extract part after the last occurrence of \
if($NameString -like '*\*') {
$NameString = $NameString.Substring($NameString.LastIndexOf('\') + 1)
}
# Remove anything after a potential .
if($NameString -like '*.*') {
$NameString.Remove($NameString.IndexOf("."))
}
$NameString
}
答案 1 :(得分:1)
正如其他海报所说,你可以使用特殊的文件名操纵器。如果您想使用正则表达式,可以说
$string.replace("\..*","")
\..*
正则表达式匹配点(\.
),然后匹配任意字符串(.*
)。
让我分别解决每个非工作正则表达式:
$string.replace(".*","")
这不起作用的原因是.
和*
都是正则表达式中的特殊字符:.
是匹配任何字符的通配符,*
1}}表示"匹配前一个字符零次或多次。"所以.*
表示"任何字符串。"
$string.replace(".\*","")
在这种情况下,您正在转义*
字符,这意味着正则表达式按字面意思对待它,因此正则表达式匹配任何单个字符(.
)后跟一个星号({{ 1}})。
\*
在这种情况下,正则表达式将匹配任何字符($string.replace(".[A-Z]","")
),后跟任何单个大写字母(.
)。
答案 2 :(得分:0)
如果字符串是使用Get-Item
的实际路径,则是另一种选择:
$path = 'C:\blah1\blah2.something'
(Get-Item $path).BaseName
此处无法使用Replace()
方法,因为它不支持通配符或正则表达式。