问题:如何使用正则表达式判断并输出字符串中的中文?
PS:我知道下面这段代码有点丑 ,能否给我一段实现同样功能的代码参考一下。
package com.cjj.shiyiyueershisiri;
import java.util.Scanner;
/**
* 字符串分类
* @author prime_cjj
* function:输入一段字符串,判断是否有中文,有的话并输出,共有多少个大小写字母、数字空格号跟其他符号,并分别列出来
*/
public class StringClassified {
public static void main(String[] args) {
//存放字符串
String totalStr = null;
char[] totalStr1 = new char[400];
//存放小写字母
char[] abcStr = new char[100];
int abcCount = 0;
//存放大写字母
char[] ABCStr = new char[100];
int ABCCount = 0;
//存放数字
char[] num = new char[100];
int numCount = 0;
//存放符号
char[] seperateStr = new char[100];
int charCount = 0;
//空格符计数器
int konggeCount = 0;
System.out.println("请随意输入一段字符串~");
//读取键盘输入并存放到totalStr字符串中
totalStr = (new Scanner(System.in)).nextLine();
//将totalStr字符串转换为字符数组
totalStr1 = totalStr.toCharArray();
if(totalStr1.length != 0){
//判断是否存在中文
if(totalStr.matches(".*[\\u4e00-\\u9faf].*")){ //
System.out.println("存在中文");
}else{
System.out.println("不存在中文");
//判断并分组,并计数
for(int i = 0;i < totalStr1.length;i ++){
if(((totalStr1[i]+0) >= ('a'+0)) && ((totalStr1[i]+0) <= ('z'+0))){
abcStr[abcCount] = totalStr1[i];
abcCount++;
}else if(((totalStr1[i]+0) >= 65) && ((totalStr1[i]+0) <= 90)){
ABCStr[ABCCount] = totalStr1[i];
ABCCount++;
}else if(((totalStr1[i]+0) >= 48) && ((totalStr1[i]+0) <= 57)){
num[numCount] = totalStr1[i];
numCount++;
}else if(totalStr1[i] == ' '){
konggeCount++;
}else{ //如何识别所有符号? [\uFE30-\uFFA0]全角字符
seperateStr[charCount] = totalStr1[i];
charCount++;
}
}
}
//输出结果:
System.out.print("您输入的原始字符串为:"+totalStr+"\n");
System.out.println("其中分类如下:");
System.out.print("小写字母共有 "+abcCount+" 个,分别为:");
for(int i = 0;i < abcStr.length;i++){
System.out.print(abcStr[i]+" ");
}
System.out.println();
System.out.print("大写字母共有 "+ABCCount+" 个,分别为:");
for(int i = 0;i < ABCStr.length;i++){
System.out.print(ABCStr[i]+" ");
}
System.out.println();
System.out.print("数字共有 "+numCount+" 个,分别为:");
for(int i = 0;i < num.length;i++){
System.out.print(num[i]+" ");
}
System.out.println();
System.out.print("符号共有 "+charCount+" 个,分别为:");
for(int i = 0;i < seperateStr.length;i++){
System.out.print(seperateStr[i]+" ");
}
System.out.println();
System.out.print("空格号“ ”共有 "+konggeCount+" 个。");
}else
System.out.println("您没有输入任何字符!");
}
}
7 个解决方案
#1
System.out.print("小写字母共有 "+abcCount+" 个,分别为:");
for(int i = 0;i < abcStr.length;i++){
System.out.print(abcStr[i]+" ");
}
System.out.println();
我知道这些重复的代码最好用函数来是实现。
但这个毕竟只是测试类。
#2
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 字符串分类
* @author prime_cjj
* function:输入一段字符串,判断是否有中文,有的话并输出,共有多少个大小写字母、数字空格号跟其他符号,并分别列出来
*/
public class StringClassified {
public static void main(String[] args) {
checkfilename("输入一段字符串,ssss判断是否有中文dd,有的话并输d出,共有多w少个大小5写字母、数字空e6格号跟其他符号,并f分别列s出来");
}
public static void checkfilename(String s){
s=new String(s.getBytes());//用GBK编码
String pattern="[\u4e00-\u9fa5]+";
Pattern p=Pattern.compile(pattern);
Matcher result=p.matcher(s);
while (result.find()) {
System.out.println(result.group());
}
}
}
#3
都学JAVA了 还是面向过程的编程习惯
#4
package com.cjj.upgrades;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringClassfied {
static String str;
public StringClassfied(){
System.out.println("请随意敲击键盘,我可以帮你分析哦!");
Scanner sc = new Scanner(System.in); //创建一个Scanner对象用来读取键盘输入
str = sc.nextLine(); //将读取到的数据转化为字符串类型
}
//分析
public void ClassifyString(String str){
/*
* 存在中文
* 判断
* public boolean matches(String regex)
* 告知此字符串是否匹配给定的正则表达式。
*/
if(str.matches(".*[\\u4e00-\\u9faf].*")){
String pattern="[\u4e00-\u9fa5]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将中文存放到arrays中
arrays.add(result.group());
}
System.out.print("存在中文,有 "+arrays.size()+" 个字,分别为:");
Object[] zhongwen = arrays.toArray();
print(zhongwen);
}else{
System.out.println("不存在中文。");
}
System.out.println();
//小写字母
if(str.matches(".*[a-z].*")){
String pattern="[a-z]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在小写字母,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在小写字母。");
}
System.out.println();
//大写字母
if(str.matches(".*[A-Z].*")){
String pattern="[A-Z]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在大写字母,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在大写字母。");
}
System.out.println();
//数字
if(str.matches(".*[0-9].*")){
String pattern="[0-9]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在数字,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在数字。");
}
System.out.println();
//空格号
if(str.matches(".*[ ].*")){
String pattern="[ ]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在空格号,有 "+arrays.size()+" 个");
}else{
System.out.println("不存在空格号。");
}
System.out.println();
//符号
if(str.matches(".*[^A-Za-z0-9_].*")){
String pattern="[^A-Za-z0-9_]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在符号,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在数字。");
}
System.out.println();
}
public void print(Object[] obj){
for(int i = 0;i < obj.length;i++){
System.out.print(obj[i]+" ");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
StringClassfied sc1 = new StringClassfied();
sc1.ClassifyString(str);
}
}
感谢你的提示,我查阅了API以及搜索了正则表达式的使用。
根据你的提示,我修改了下代码(如上),但是有一个问题,就是符号比如逗号,句号如何用正则表达式来判断?
#5
谢谢你的指正,我已经修改了代码,java本来就是面向对象的思想。
#6
一些常用的正则匹配规则
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
#7
虽然没有匹配符号(如,。)的,但是也非常感谢!
#1
System.out.print("小写字母共有 "+abcCount+" 个,分别为:");
for(int i = 0;i < abcStr.length;i++){
System.out.print(abcStr[i]+" ");
}
System.out.println();
我知道这些重复的代码最好用函数来是实现。
但这个毕竟只是测试类。
#2
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 字符串分类
* @author prime_cjj
* function:输入一段字符串,判断是否有中文,有的话并输出,共有多少个大小写字母、数字空格号跟其他符号,并分别列出来
*/
public class StringClassified {
public static void main(String[] args) {
checkfilename("输入一段字符串,ssss判断是否有中文dd,有的话并输d出,共有多w少个大小5写字母、数字空e6格号跟其他符号,并f分别列s出来");
}
public static void checkfilename(String s){
s=new String(s.getBytes());//用GBK编码
String pattern="[\u4e00-\u9fa5]+";
Pattern p=Pattern.compile(pattern);
Matcher result=p.matcher(s);
while (result.find()) {
System.out.println(result.group());
}
}
}
#3
都学JAVA了 还是面向过程的编程习惯
#4
package com.cjj.upgrades;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringClassfied {
static String str;
public StringClassfied(){
System.out.println("请随意敲击键盘,我可以帮你分析哦!");
Scanner sc = new Scanner(System.in); //创建一个Scanner对象用来读取键盘输入
str = sc.nextLine(); //将读取到的数据转化为字符串类型
}
//分析
public void ClassifyString(String str){
/*
* 存在中文
* 判断
* public boolean matches(String regex)
* 告知此字符串是否匹配给定的正则表达式。
*/
if(str.matches(".*[\\u4e00-\\u9faf].*")){
String pattern="[\u4e00-\u9fa5]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将中文存放到arrays中
arrays.add(result.group());
}
System.out.print("存在中文,有 "+arrays.size()+" 个字,分别为:");
Object[] zhongwen = arrays.toArray();
print(zhongwen);
}else{
System.out.println("不存在中文。");
}
System.out.println();
//小写字母
if(str.matches(".*[a-z].*")){
String pattern="[a-z]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在小写字母,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在小写字母。");
}
System.out.println();
//大写字母
if(str.matches(".*[A-Z].*")){
String pattern="[A-Z]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在大写字母,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在大写字母。");
}
System.out.println();
//数字
if(str.matches(".*[0-9].*")){
String pattern="[0-9]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在数字,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在数字。");
}
System.out.println();
//空格号
if(str.matches(".*[ ].*")){
String pattern="[ ]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在空格号,有 "+arrays.size()+" 个");
}else{
System.out.println("不存在空格号。");
}
System.out.println();
//符号
if(str.matches(".*[^A-Za-z0-9_].*")){
String pattern="[^A-Za-z0-9_]"; //正则表达式
Pattern p=Pattern.compile(pattern); //将给定的正则表达式编译到模式中。
Matcher result=p.matcher(str); //创建匹配给定输入与此模式的匹配器。
ArrayList arrays = new ArrayList();
while (result.find()) { //如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
//将对象存放到arrays中
arrays.add(result.group());
}
System.out.print("存在符号,有 "+arrays.size()+" 个,分别为:");
Object[] SmallLetter = arrays.toArray();
print(SmallLetter);
}else{
System.out.println("不存在数字。");
}
System.out.println();
}
public void print(Object[] obj){
for(int i = 0;i < obj.length;i++){
System.out.print(obj[i]+" ");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
StringClassfied sc1 = new StringClassfied();
sc1.ClassifyString(str);
}
}
感谢你的提示,我查阅了API以及搜索了正则表达式的使用。
根据你的提示,我修改了下代码(如上),但是有一个问题,就是符号比如逗号,句号如何用正则表达式来判断?
#5
谢谢你的指正,我已经修改了代码,java本来就是面向对象的思想。
#6
一些常用的正则匹配规则
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
#7
虽然没有匹配符号(如,。)的,但是也非常感谢!