pixelbits предоставил отличное решение, но оно не работает в последней версии Angular (v4.3.1), поскольку директивы обесцениваются из компонента. Мое решение основано на его ответе только, но работает с последним
. Я предоставляю общее решение с настраиваемой директивой атрибута с логическим вводом, который будет скрывать ввод в верхний регистр, если это правда.
upper-case.directive.ts:
import { Directive, ElementRef, Input } from '@angular/core';
@Directive({
selector: '[UpperCase]',
host: {
'(input)': 'toUpperCase($event.target.value)',
}
})
export class UpperCaseTextDirective {
@Input('UpperCase') allowUpperCase: boolean;
constructor(private ref: ElementRef) {
}
toUpperCase(value: any) {
if (this.allowUpperCase)
this.ref.nativeElement.value = value.toUpperCase();
}
}
Вот соответствующий компонент приложения с шаблоном.
app.ts
//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {UpperCaseTextDirective} from './upper-case.directive'
@Component({
selector: 'my-app',
template: `
Hello {{name}}
Auto Capitalize True:
Auto Capitalize False:
`,
})
export class App {
name:string;
allowEdit:boolean;
constructor() {
this.name = `Angular! v${VERSION.full}`;
this.allowEdit= false;
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App,UpperCaseTextDirective ],
bootstrap: [ App ]
})
export class AppModule {}
Здесь Plnkr , которые демонстрируют это.
Используйте комбинацию isAlphabetic
и isDigit
, в противном случае у вас есть специальный символ.
public class Separater {
static String splitString(String str) {
String result = "";
int i=0;
while (i < str.length()) {//Using while instead of for, to avoid skipping characters due to auto increment by the loop.
if (Character.isDigit(str.charAt(i))) {
while (i < str.length() && Character.isDigit(str.charAt(i))) {
result += str.charAt(i);
i++;
}
result += " ";
} else if (Character.isAlphabetic(str.charAt(i))) {
while (i < str.length() && Character.isAlphabetic(str.charAt(i))) {
result += str.charAt(i);
i++;
}
result += " ";
} else {
while (i < str.length() && !Character.isAlphabetic(str.charAt(i)) && !Character.isDigit(str.charAt(i))) {
result += str.charAt(i);
i++;
}
result += " ";
}
}
return result;
}
public static void main(String[] args) {
System.out.println(splitString("تجاؤي#*(اىيلاؤت678345شسسصي*&&*^*!!محجذلب"));
}
}
Вывод Обратите внимание, что пространство между подстрокой больше, но SO удаляет лишние пробелы!
تجاؤي # * (اىيلاؤت 678345 شسسصي & amp; ^ * !! محجذلب
blockquote>
Я сделал функцию, которую вы должны сделать именно так, я не уверен, какие именно символы вы хотите, поэтому вам придется изменить SYMBOL_MATCHER_REGEX, чтобы он соответствовал любым символам, которые вы ищете.
$ 0 является ссылкой на совпадение, найденное шаблоном, функция просто заменяет совпадение на себя, но с вкладками до и после добавления.
/**
* The regex used to find any symbols you are looking for.
*/
private String SYMBOL_MATCHER_REGEX = "[0-9]+";
/**
* A replacement which adds space before and after the match.
*/
private String REPLACEMENT_STRING = " [110] ";
/**
* Compiled pattern for the SYMBOL_MATCHER_REGEX.
*/
private Pattern SYMBOL_PATTERN = Pattern.compile(SYMBOL_MATCHER_REGEX);
public String formatUyghur(String uyghurText) {
Matcher matcher = SYMBOL_PATTERN.matcher(uyghurText);
return matcher.replaceAll(REPLACEMENT_STRING);
}