4-2判断字符串a是否以字符串b开头或结尾

本文介绍了一种通过Python脚本来批量修改.sh和.py文件的用户执行权限的方法。利用os模块的功能,结合文件名的后缀匹配,实现了对指定类型文件权限的自动化调整。
# -*- coding:utf-8 -*-

"""
某文件系统目录下有一系列文件:
quicksort.c
graph.py
heap.java
install.sh
stack.cpp
....
编写程序给其中所有.sh文件和.py文件加上用户可执行权限

解决方案:
使用字符串的str.startwith()和str.endwith()方法.
注意:多个匹配时参数使用元组.
"""

import  os, stat

# os.listdir('.')       # 列出当前目录下的所有文件
s = 'g.sh'

print(s.endswith(('.sh', '.py')))       # 参数可以接收元组,但不接收列表

ls = [name for name in os.listdir('.') if name.endswith(('.sh', '.py'))]
print ls

os.stat('e.py')   # 查看文件的属性
os.stat('e.py').st_mode    # 文件属性中有关文件权限的一项
oct(os.stat('e.py').st_mode)   # 结果为0100664,最后结尾三个数字664就是文件的权限
stat.S_IXUSR      # 有一个掩码和上述权限数字进行或运算,将为文件增加相应的权限
os.chmod('e.py', os.stat('e.py').st_mode | stat.S_IXUSR)
<think>我们被要求判断一个字符串是否以特定字符('-')开头。在Java中,我们可以使用String类的startsWith方法。根据引用[1],startsWith方法是String类的一个方法,用于检查一个字符串是否以特定的字符序列开始。 具体步骤: 1. 定义一个字符串变量。 2. 使用startsWith方法,传入一个字符串参数(这里我们传入的是单个字符的字符串,即"-")。 3. 根据返回值(boolean类型)判断。 注意:startsWith方法有两个重载版本: - boolean startsWith(String prefix):测试此字符串是否以指定的前缀开头- boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开头。 我们只需要使用第一个版本即可。 示例代码: ```java public class StartsWithExample { public static void main(String[] args) { String testString1 = "-Hello"; String testString2 = "Hello"; // 检查是否以'-'开头 System.out.println(testString1.startsWith("-")); // 输出 true System.out.println(testString2.startsWith("-")); // 输出 false } } ``` 另外,如果我们要检查的字符是单个字符,也可以使用charAt(0)方法,检查字符串的第一个字符是否为'-'。但要注意,如果字符串为空,调用charAt(0)会抛出异常。因此,使用startsWith更安全,因为即使字符串为空,startsWith("-")会返回false,而不会抛出异常。 使用charAt(0)的示例: ```java if (str != null && !str.isEmpty() && str.charAt(0) == '-') { // 以'-'开头 } ``` 但是,推荐使用startsWith方法,因为它更简洁,并且直接表达了意图。 根据引用[2]和引用[3],我们还可以了解到String类的一些其他特性,比如字符串不可变,以及一些常用的方法。 因此,针对用户的问题,我们建议使用startsWith方法。 相关问题: 1. 如何判断字符串是否以多个特定字符(例如"--")开头2. 如何忽略大小写检查字符串是否以某个前缀开头? 3. 如何检查字符串是否以特定字符结尾4. 如何检查字符串的中间部分是否包含特定字符序列? 5. 在Java中,除了startsWith方法,还有哪些常用的字符串匹配方法?</think>### Java 判断字符串是否以特定字符开头的方法 在 Java 中判断字符串是否以特定字符(如 `-`)开头,推荐使用以下两种方法: --- #### ✅ 方法一:`startsWith()` 方法(最简洁) ```java String str = "-HelloWorld"; boolean result = str.startsWith("-"); // true ``` **原理**: - `startsWith()` 是 String 类原生方法,直接检查字符串起始位置 - 时间复杂度 $O(1)$,性能最优[^1] -字符串安全:`"".startsWith("-")` 返回 `false` --- #### ✅ 方法二:`charAt()` 方法(底层控制) ```java String str = "-Java"; boolean result = !str.isEmpty() && str.charAt(0) == '-'; // true ``` **适用场景**: - 需要额外检查首字符的 Unicode 值等特殊情况 - 需显式处理空字符串(避免 `StringIndexOutOfBoundsException`) --- #### ⚠️ 注意事项 1. **空字符串处理** ```java String empty = ""; System.out.println(empty.startsWith("-")); // false System.out.println(empty.charAt(0)); // 抛出异常 ``` 2. **Unicode 字符支持** ```java String unicodeStr = "★Stars"; System.out.println(unicodeStr.startsWith("★")); // true ``` 3. **大小写敏感** ```java String caseStr = "-test"; System.out.println(caseStr.startsWith("_")); // false (区分大小写) ``` --- ### 🚀 性能对比 | 方法 | 空字符串安全 | 可读性 | 性能 | 适用场景 | |---------------------|--------------|--------|--------|------------------| | `str.startsWith()` | ✅ | ★★★★★ | $O(1)$ | 绝大多数情况 | | `str.charAt(0)` | ❌需额外检查 | ★★★☆☆ | $O(1)$ | 需操作字符的场景 | > **推荐**:优先使用 `startsWith()`,代码更简洁且符合 Java 字符串操作规范[^2][^3]。 --- ### 🌐 完整示例 ```java public class StartsWithDemo { public static void main(String[] args) { String[] testCases = {"-OK", "Error", "", "★Special"}; for (String str : testCases) { // 首选方法 boolean result1 = str.startsWith("-") || str.startsWith("★"); // 备选方法(需空检查) boolean result2 = !str.isEmpty() && (str.charAt(0) == '-' || str.charAt(0) == '★'); System.out.printf("'%s' → startsWith: %5b | charAt: %5b\n", str, result1, result2); } } } ``` **输出**: ``` '-OK' → startsWith: true | charAt: true 'Error' → startsWith: false | charAt: false '' → startsWith: false | charAt: false '★Special' → startsWith: true | charAt: true ``` --- ### 📚 相关问题 1. 如何检查字符串是否以多个特定字符(如 `--`)开头2. 如何忽略大小写判断字符串前缀? 3. Java 中 `startsWith()` 和 `charAt()` 的底层实现有何差异? 4. 如何处理包含代理对(Surrogate Pairs)的 Unicode 字符串前缀? 5. 为什么 `charAt(0)` 对空字符串会抛出异常?如何避免? ```java // 扩展案例:检查多个前缀字符 public static boolean startsWithAny(String str, char... prefixes) { if (str.isEmpty()) return false; char firstChar = str.charAt(0); for (char prefix : prefixes) { if (firstChar == prefix) return true; } return false; } // 调用示例 boolean result = startsWithAny("★Hello", '-', '★', '+'); // true ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值