修剪字符串的结尾

时间:2015-08-10 21:06:03

标签: regex string powershell

我无法修剪字符串末尾的某些字符。字符串通常如下所示:

C:\blah1\blah2

但有时它看起来像:

C:\blah1\blah2.extra

我需要提取字符串'blah2'。大多数情况下,使用substring命令很容易。但是在极少数情况下,当存在'.extra'部分时,我需要首先修剪该部分。

问题是,'。extra'总是以点开头,但接着是不同长度的各种字母组合。所以通配符是必要的。基本上,我需要编写脚本,“如果字符串包含一个点,则修剪点和后面的任何内容。”

$string.replace(".*","")不起作用。 $string.replace(".\*","")也没有。 $string.replace(".[A-Z]","")也没有。

另外,我也无法从字符串的开头得到它。 'blah1'未知且长度各异。我必须从字符串末尾处获得'blah2'。

3 个答案:

答案 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()方法,因为它不支持通配符或正则表达式。